* 作用:代理模式给某一个对象提供一个代理对象,并由代理对象来控制对原对象的引用,在不修改原对象代码的基础上,对原对象的功能进行修改或增强。
* 代理模式分为 静态代理 和 动态代理
- 静态代理是由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行之前,代理类.class文件就已经被创建了。
- 动态代理是在程序运行时通过反射机制动态创建的。动态代理技术是在内存中生成对象的一种技术,也就是整个代理过程在内存中进行,我们不需要手写代理类的代码,也不会存在代理类的编译过程,而是直接在运行期凭空造出
一个代理对象供我们使用。
* 动态代理技术有一下两种实现:
- 基础JDK接口的动态代理:JDK自带的动态代理技术,需要用一个静态方法来创建代理对象,它要求被代理对象,也就是目标类,必须实现接口,生成的代理对象和原对象都实现了相同的接口,是兄弟关系。
- 基础CJLIB的动态代理:
* JDK动态代理参数详解
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] Interfaces(), InvocationHandler invocationHandler )
- ClassLoader loader: 指定被代理对象的类加载器,用户加载目标类(被代理类)及其接口的字节码文件。 使用getClassLoader()获取。 例如: Customer.class.getClassLoader(), Customer类的类加载器。
- Class<?>[] Interfaces() :指定被加载对象所实现的所有接口的字节码对象数组,使用getInterfaces()获取。 例如; Customer.class.getInterfaces()
- InvocationHandler 这是一个接口,主要使用该接口中的invoke()方法 : public Object invoke(Object proxy, Method method, Object[] args1),该方法会在代理类对象调用方法时执行,
也就是说在代理类对象调用父接口中的任意方法时,invoke()方法都会执行。所以我们在此方法中完成对代码的增强和扩展。
- invoke() 方法参数详解 public Object invoke(Object proxy, Method method, Object[] args)
- proxy代理类对象的引用,也就是Proxy.newProxyInstance()方法的返回值。
- method:对应的是触发invoke()方法执行的method对象。 例如:代理对象调用了XXX方法,那么该方法就会触发invoke()方法执行,那么此时method对应的就是xxx方法。
- Object[] args : 代理对象调用方法时,传递的实际参数
* 基于接口的动态代理,实际上是在内存中生成了一个代理对象,该代理对象实现了目标对象(被代理对象)的所有接口,所以代理对象和目标对象是兄弟关系,共同实现了一个同一个接口。
- 动态代理类代码:
```
public class DynamicTest {
public static void main(final String[] args) {
//准备一个被代理的对象
final Customer customer=new Customer();
//使用JDK自带API 创建动态代理对象
OrderInterface deliverClerk= (OrderInterface) Proxy.newProxyInstance(Customer.class.getClassLoader(),
Customer.class.getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=method.invoke(customer,args);
return result;
}
}
);
//调用代理对象执行对应方法
String result=deliverClerk.Order("麻婆豆腐");
System.out.println(result);
}
}
```
```
顾客类
public class Customer implements OrderInterface {
public String Order(String foodName) {
return "已经下单点了"+foodName;
}
public void pay() {
}
public void shout() {
}
}
```
```
接口
public interface OrderInterface {
//点餐 并指定菜名
public String Order(String foodName);
//付款
public void pay();
//叫服务员
public void shout();
}
原文:https://www.cnblogs.com/szqengr/p/14754899.html