动态代理
主要类和方法
- InvocationHandler接口
- 实现该接口
- 声明被代理对象obj,声明绑定obj的方法
- 重写的invoke在代理类调用方式时自动调用
- 在重写的invoke方法中调用obj中的方法
Proxy类
- newProxyInstance静态方法,传入构造器、被代理类实现的接口数组,和InvocationHandler的实现类的实例。
- 返回代理类,以供调用
两个问题
如果根据被加载到内存中的被代理类,动态的去创建一个代理类和其对象
当通过代理类的对象调用方法的时候,如果动态的去调用被代理类中的同名方法。 ```java public class test { public static void main(String[] agrs){
//声明被代理类
NikeFactory nikeFactory = new NikeFactory();
//获取代理类
Factory factory = (Factory)
ProxyFactory.proxy(nikeFactory);
String result = factory.product();
System.out.println(result);
} } //接口 interface Factory{ String product(); } //被代理类 class NikeFactory implements Factory{ @Override public String product() {
System.out.println("生产一百双鞋子");
return "100";
} } //实现接口解决问题二 class MyInvocation implements InvocationHandler{ //被代理类对象 private Object object; //绑定被代理类对象 public void bind(Object object){
this.object = object;
} //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法invoke() @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object, args);
}
} //动态创建代理类 class ProxyFactory { //调用此方法返回一个代理类对象,解决问题一。obj被代理类的对象。 public static Object proxy(Object obj){ MyInvocation hInvocation = new MyInvocation(); hInvocation.bind(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), hInvocation); } } ```