动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。
代码:
生命被代理对象所实现的接口
public interface SubjectInf {
String Say(String name);
}
被代理对象的具体实现:
public class SubjectImpl implements SubjectInf {
@Override
public String Say(String name) {
// TODO Auto-generated method stub
return "hello"+name;
}
}public class SubjectDyanmic implements InvocationHandler {
private SubjectImpl subject;
public SubjectDyanmic(SubjectImpl subject) {
super();
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke run..." );
if (args == null) {
method.invoke(subject, args);
return null;
} else
{
String res = (String) method.invoke(subject, args);
return res;
}
}
}
public class Client {
public static void main(String[] args) {
SubjectImpl sub =new SubjectImpl();
InvocationHandler handler = new SubjectDyanmic(sub);
System.out.println("进入前");
//生成代理对象
SubjectInf subinf = (SubjectInf)Proxy.newProxyInstance(sub.getClass().getClassLoader()
,sub.getClass().getInterfaces(), handler);
System.out.println("代理生成完毕");
/***
* 当要执行被代理对象的某个方法时会立即执行handler里面的invoke方法(反射),
* 不执行被代理对象的某个方法时不会执行handler的方法
*/
String res=subinf.Say("Li");
System.out.println(res);
}
}</pre><pre>
程序输出:
进入前 代理生成完毕 invoke run... helloLi
如果我们测试Clinent不调用被代理对象的某个方法时 输出:
进入前 代理生成完毕 helloLi
原文地址:http://blog.csdn.net/liyantianmin/article/details/42194123