interface Subject{
public String say(String name,int age) ; // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
public String say(String name,int age){
return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ; //new RealSubject()
public Object bind(Object obj){
this.obj = obj ; // 真实主题类 //Subject
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);//动态返回一个代理
} //this--new MyInvocationHandler()
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("aaaaaaa");
Object temp = method.invoke(this.obj,args) ; // 调用方法 this.obj
return temp ; //this--new RealSubject()
}
};
public class DynaProxyDemo{
public static void main(String args[]){
Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
//Object sub = new MyInvocationHandler().bind(new RealSubject()) ;
//System.out.println(sub.getClass().getName());
String info = sub.say("李李",24) ;
System.out.println(info) ;
}
}
我在程序中this和其他方法所代表的对象进行了标记
1.Proxy可以用于创建动态代理类,MyInvocationHandler类中自定义了一个bind()方法
此方法调用了,Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h),这就会返回
一个动态代理类,this代表调用bind()方法的对象(MyInvocationHandler类的实例),也就是InvocationHandler的子类对象
2sub.say()之后会调用invoke(Object proxy,Method method,Object[] args)方法,sub传给 proxy,say传给method
其中的参数传给args,代理类中的方法在通过method.invoke()方法调用目标类中的方法(在目标类方法适当位置可添加争强语句)
3.method.invoke(this.obj,args) 调用的是目标类(不是代理类),this代表new RealSubject()
一定要明白:$proxy0是代理类,通过Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
对其进行了类型转换,目标类是RealSubject。
希望能帮你。。。
|