Java 动态代理

来源:互联网 发布:5g网络概念股龙头 编辑:程序博客网 时间:2024/03/28 22:24

    动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。

代码:

生命被代理对象所实现的接口

public interface SubjectInf {String Say(String name);}

被代理对象的具体实现:

public class SubjectImpl implements SubjectInf {@Overridepublic String Say(String name) {// TODO Auto-generated method stubreturn "hello"+name;}}

实现一个handler
public class SubjectDyanmic implements InvocationHandler {private SubjectImpl subject;public SubjectDyanmic(SubjectImpl subject) {super();this.subject = subject;}@Overridepublic 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;}}}


测试Client
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

 可见动态代理实质是分为两大块,一个是生成代理对象,再者是根据java反射去执行被代理对象的一些方法,即调用invoke方法。


0 0
原创粉丝点击