动态代理和静态代理的区别
来源:互联网 发布:阿里云视频播放器sdk 编辑:程序博客网 时间:2024/05/29 06:29
一、概念静态代理类:
二、静态代理类
由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。
例程1 HelloService.java
package proxy;
import java.util.Date;
public interface HelloService{
}
例程2 HelloServiceImpl.java
package proxy;
import java.util.Date;
public class HelloServiceImplimplements HelloService{
}
例程3 HelloServiceProxy.java
package proxy;
import java.util.Date;
public class HelloServiceProxy implements HelloService{
}
例程4 Client1.java
package proxy;
public class Client1{
}
运行Client1 类,打印结果如下:
before calling echo()
after calling echo()
echo:hello
例程3 的HelloServiceProxy类的源代码是由程序员编写的,在程序运行前,它的.class文件就已经存在了,这种代理类称为静态代理类。
三、动态代理类
Proxy类提供了创建动态代理类及其实例的静态方法。
(1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:
public static Class<?>getProxyClass(ClassLoader loader,Class<?>[] interfaces) throwsIllegalArgumentException
(2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler handler) throws
以下两种方式都创建了实现Foo接口的动态代理类的实例:
//创建InvocationHandler对象
InvocationHandler handler = new MyInvocationHandler(...);
//创建动态代理类
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(),new Class[] { Foo.class });
//创建动态代理类的实例
Foo foo = (Foo) proxyClass.getConstructor(new Class[] {InvocationHandler.class }).
//创建InvocationHandler对象
InvocationHandler handler = new MyInvocationHandler(...);
//直接创建动态代理类的实例
Foo foo = (Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] {Foo.class }, handler);
由Proxy类的静态方法创建的动态代理类具有以下特点:
Proxy 类的isProxyClass(Class<?>cl)静态方法可用来判断参数指定的类是否为动态代理类。只有通过Proxy类创建的类才是动态代理类;
动态代理类都具有一个public 类型的构造方法,该构造方法有一个InvocationHandler 类型的参数。
由Proxy类的静态方法创建的动态代理类的实例具有以下特点:
1. 假定变量foo 是一个动态代理类的实例,并且这个动态代理类实现了Foo 接口,那么“foo instanceofFoo”的值为true。把变量foo强制转换为Foo类型是合法的:
(Foo) foo //合法
2.每个动态代理类实例都和一个InvocationHandler 实例关联。Proxy类的getInvocationHandler(Objectproxy)静态方法返回与参数proxy指定的代理类实例所关联的InvocationHandler 对象。
3.假定Foo接口有一个amethod()方法,那么当程序调用动态代理类实例foo的amethod()方法时,该方法会调用与它关联的InvocationHandler对象的invoke()方法。
InvocationHandler 接口为方法调用接口,它声明了负责调用任意一个方法的invoke()方法:
Object invoke(Object proxy,Method method,Object[] args) throwsThrowable
参数proxy指定动态代理类实例,参数method指定被调用的方法,参数args指定向被调用方法传递的参数,invoke()方法的返回值表示被调用方法的返回值。
0 0
- 动态代理和静态代理的区别
- 动态代理和静态代理的区别
- 动态代理和静态代理的区别
- 代理模式 静态代理和动态代理的区别
- Java动态代理和静态代理的区别
- Java动态代理和静态代理的区别
- 13_动态代理和静态代理的区别
- 动态代理与静态代理的区别
- Spring的静态代理和动态代理
- java的静态代理和动态代理
- 动态代理和静态代理的比较
- Java 的静态代理和动态代理
- java的动态代理和静态代理
- Java的静态代理和动态代理
- Spring的静态代理和动态代理
- Java的静态代理和动态代理
- 静态代理和动态代理的理解
- 动态代理和静态代理的学习
- 反编译apk添加新功能后出现nullpointerexception空指针异常
- 查看后台更改删除记录
- 黑马程序员 IO流总结
- js简易的图片自动轮播
- JSTL JSP标准标签库的配置
- 动态代理和静态代理的区别
- 窦靖童手缠绷带秀英俊侧脸 网友直呼帅哭
- @RequestMapping 用法详解之地址映射
- VC6.0中无法使用打开按钮,无法添加已有的文件
- selenium+python的163自动写邮件脚本
- U-Boot 编译(嵌入式U-BOOT,kernel编译)
- android获取应用程序大小,缓存数据信息
- android精确绘制文字位置的方法
- Android中处理崩溃异常