java代理机制,java设计模式之代理模式
如何解决写爬虫IP受阻的问题?立即使用。
先介绍一下什么是代理。
(学习视频分享:java视频教程)
代理是一种设计模式,其核心思想是将对目标的访问转移到代理对象上。这样做的好处是,目标对象可以通过代理对象添加一些额外的功能,而无需更改代码。这是一种编程思路,在不改变原代码的情况下,通过代理增加一些扩展功能。
代理过程如图,用户访问代理对象,代理对象访问目标对象,达到用户访问目标对象的目的。
代理模式包括以下三个角色:
ISubject:接口对象,它是由对象及其代理共享的接口。
TargetSubject:目标对象,是实现抽象主题接口的类。
Proxy:代理角色,包含对目标对象TargetSubject的引用,这样就可以操作真实的对象了。代理提供了与目标对象相同的接口,因此它可以随时替换目标对象。同时,代理对象在执行目标对象的操作时可以附加其他操作,相当于封装了真实对象。
常见的代理模式有静态代理和动态代理,动态代理在Java中的实现有JDK动态代理和cglib代理。
静态代理
前面说过,代理模式有三个角色,一个是目标接口,一个是目标对象,第三个是代理对象。
现在用具体代码实现了。首先,目标界面如下:
公共接口IBlogService {
void write blog();
}目标对象用下面的代码实现目标接口:
公共类BlogService实现IBlogService {
@覆盖
public void writeBlog() {
System.out.println(我正在写.);
}
}静态代理对象,通过构造方法获取目标对象,实现目标接口。目标对象的方法在目标接口的方法中调用,代码如下:
公共类BlogStaticProxy实现IBlogService{
私有IBlogService blogService
公共BlogStaticProxy(IBlogService blog service){
this . blog service=blog service;
}
@覆盖
public void writeBlog() {
System.out.println(开始写入.);
blog service . write blog();
System.out.println(结束写入.);
}
}静态代理对象,通过构造方法获取目标对象,实现目标接口。目标对象的方法在目标接口的方法中调用,代码如下:
公共类BlogStaticProxy实现IBlogService{
私有IBlogService blogService
公共BlogStaticProxy(IBlogService blog service){
this . blog service=blog service;
}
@覆盖
public void writeBlog() {
System.out.println(开始写入.);
blog service . write blog();
System.out.println(结束写入.);
}
}测试:
公共类TestStaticProxy {
公共静态void main(String[] args) {
IBlogService target=new blog service();
BlogStaticProxy proxy=new BlogStaticProxy(target);
proxy . write();
}
}开始写……
我在写…
结束编写…静态代理,不需要修改目标对象,可以通过代理对象做额外的扩展功能。但是,静态方法不是很灵活。如果修改了目标接口的代码,那么目标对象和代理对象都需要修改。
动态代理在一定程度上避免了这种情况。动态代理不需要代理对象来实现目标接口,在java虚拟机的内存中动态生成代理对象。
Jdk动态对象
Jdk的动态代理由类代理生成,它有三个参数:
Classloader,指定当前目标对象使用类加载器,获取加载器的方法是固定的。
班级?[] interfaces:目标对象实现的接口的类型,该类型以通用的方式确认。
InvocationHandler h:事件处理,当执行目标对象的方法时,会触发事件处理程序的方法,将当前执行的目标对象的方法作为参数传入。
公共静态对象newProxyInstance(类加载器loader,
班级?[]接口,
InvocationHandler h)
抛出非法数据异常
{
}Jdk的动态代理代码如下:
公共类JdkBlogProxyFactory {
私有对象目标;
公共JdkBlogProxyFactory(对象目标){
目标=目标
}
公共对象newInstance() {
返回代理。newproxyinstance(目标。getclass().getClassLoader()、target.getClass().getInterfaces(),
(代理、方法、参数)- {
System.out.println(开始写入);
Object o=method.invoke(target,args);
System.out.println(结束写入);
返回o;
});
}
}测试类:
公共类TestJdkProxy {
公共静态void main(String[] args) {
IBlogService target=new blog service();
系统。出去。println(目标。getclass());
//给目标对象,创建代理对象
IBlogService proxy=(IBlogService)new JdkBlogProxyFactory(target).新实例();
//类代理0内存中动态生成的代理对象
系统。出去。println(代理。getclass());
//执行方法【代理对象】
代理。写博客();
}
}控制台打印如下:
class com。去ZP。代理。博客服务
class com.sun.proxy.$Proxy0
开始写作
我在写东西.
结束编写能说会道的动态代理
字节码生成采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
CglibBlogFactory代理工厂类如下:
公共类CglibBlogFactory实现MethodInterceptor {
私有对象目标;
公共CglibBlogFactory(对象目标){
目标=目标
}
//给目标对象创建一个代理对象
公共对象getProxyInstance() {
//1.工具类
增强剂en=新增强子();
//2.设置父类
恩。设置超类(目标。getclass());
//3.设置回调函数
恩。设置回调(this);
//4.创建子类(代理对象)
返回恩。create();
}
@覆盖
公共对象拦截(对象哦,方法方法,对象[]对象,方法代理方法代理)抛出可投掷的
System.out.println(开始写入.);
//执行目标对象的方法
对象返回值=方法。调用(目标、对象);
System.out.println(结束写入.);
返回返回值
}
}测试类:
公共类TestCglib {
公共静态void main(String[] args) {
IBlogService target=new blog service();
//代理对象
IBlogService proxy=(IBlogService)new CglibBlogFactory(target).getProxyInstance();
//执行代理对象的方法
代理。写博客();
}
}运行程序,控制台打印:
开始写作.
我在写东西.
结束写作.相关推荐:java入门教程以上就是爪哇岛代理模式介绍的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。