目标
通过一个代理类完成全部的代理功能,需要使用动态代理完成
动态代理机制: java.lang.reflect.InvocationHandler,java.lang.reflect.Proxy类的支持
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
在此接口中只定义了一个invoke( )方法,3个参数的意义:
参数 | 意义 |
---|---|
Object proxy | 被代理的对象 |
Method method | 要调用的方法 |
Object args[] | 方法调用时所需要的参数 |
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。Proxy类提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数 | 意义 |
---|---|
ClassLoader loader | 类加载器 |
Class[] interfaces | 得到全部接口 |
InvocationHandler h | 得到InvocationHandler接口的子类实例 |
// 取得类加载器
Person per = new Person();
System.out.print("类加载器:"+per.getClass().getClassLoader().getClass().getName());
// sun.misc.Launcher$AppClassLoader
下面实现动态代理
// 定义MyInvocationHandler
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);// 取得代理对象
}
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
Object temp = method.invoke(this.obj, args);
return temp;
}
}
在MyInvocationHandler类的bind( )方法中接收被代理对象的真实主题实现,之后覆写InvocationHandler接口中的invoke( )方法,完成具体的方法调用
// 定义接口
public interface Subject {
public String say(String name, int age);
}
// 定义真实主题实现类
public class RealSubject implements Subject {
public String say(String name, int age) {
return "姓名:"+name+", 年龄"+age;
}
}
// 测试动态代理
main(String[] args) {
MyInvocationHandler handler = new MyInvocationHandler();
Subject sub = (Subject)handler.bind(new RealSubject());
String info = sub.say("张三", 120);
System.out.print(info);
}
类的生命周期
图中有好几个错别字/汗