Java 动态代理
2014-12-27 16:41
267 查看
动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。
代码:
生命被代理对象所实现的接口
被代理对象的具体实现:
实现一个handler
测试Client
程序输出:
如果我们测试Clinent不调用被代理对象的某个方法时 输出:
可见动态代理实质是分为两大块,一个是生成代理对象,再者是根据java反射去执行被代理对象的一些方法,即调用invoke方法。
代码:
生命被代理对象所实现的接口
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; } }
实现一个handler
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; } } }
测试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方法。
相关文章推荐
- 使用JAVA中的动态代理实现数据库连接池 Z
- 使用Java动态代理实现AOP
- 使用JAVA中的动态代理实现数据库连接池
- 使用JAVA中的动态代理实现数据库连接池
- 用Java动态代理实现AOP
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- Java动态代理实现AOP
- AOP系列之三:用Java动态代理实现AOP [zz]
- 迈出AOP第一步--使用Java 动态代理实现AOP[zz]
- 使用JAVA中的动态代理实现数据库连接池
- 使用JAVA中的动态代理实现数据库连接池
- Java动态代理实现
- 用Java动态代理实现AOP
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- 用Java动态代理实现AOP
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP(转)
- 使用java 动态代理去掉代码中的bad smell。
- 使用JAVA中的动态代理实现数据库连接池
- AOP初学者第一步:用Java动态代理实现AOP
- 动态代理(Dynamic Proxy)Java Servlet