java 动态代理
2012-03-11 14:39
357 查看
package reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; // 定义一个业务接口 interface Count { public void queryCount(); public void updateCount(); } // 实现业物接口类 class CountImp implements Count { @Override public void queryCount() { System.out.println("queryCount run..."); } @Override public void updateCount() { System.out.println("updateCount run..."); } } // 定义代理类 class CountProxy implements Count { private CountImp imp = null; public CountProxy(CountImp s) { this.imp = s; } @Override public void queryCount() { System.out.println("queryCount run before..."); imp.queryCount(); } @Override public void updateCount() { System.out.println("updateCount run before..."); imp.updateCount(); } } /* * 这是一个明显的静态代理,代理主要是为委托预处理消息、过滤消息,把消息转发给委托类,以 * 及事后处理消息等,代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的 * 对象相关联借类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定 的服务 */ /* * +++++++++++++++++++++++++++下面是一个动态代理++++++++++++++++++ */ interface BookAdd { public void add(); public void show(); } class BookService implements BookAdd { @Override public void add() { System.out.println("books alreay added..."); } public void show() {} } class BookProxy implements InvocationHandler { private Object target = null;// 代理的委托类 public Object bind(Object target) { this.target = target; return Proxy.newProxyInstance(this.getClass().getClassLoader(), target .getClass().getInterfaces(), this);// 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用 // 程序 // 该方法实际是先取得接口 } // 类加载器, // 代理的接口, 指定的调用处理程序 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable // 被代理的对象,执行对象里的方法,执行方法的参数 { // 代理实例, 接口中的方法 参数 Object result = null; // System.out.println(method.toString()); System.out.println(proxy.getClass()); System.out.println("事物执行的开始..."); result = method.invoke(target, args); System.out.println("事物执行结束"); return result; } } public class Agency { public static void main(String args[]) { dynamicProxy(); } public static void staticProxy() { CountImp imp = new CountImp(); CountProxy proxy = new CountProxy(imp); proxy.queryCount(); proxy.updateCount(); } public static void dynamicProxy() { // 得到一个代理 BookAdd proxy = (BookAdd) new BookProxy().bind(new BookService()); proxy.add(); System.out.println(proxy.getClass()); System.out.println("proxy 属性:"); Field fields[] = proxy.getClass().getDeclaredFields(); for (Field f : fields) System.out.println(f.getName()); System.out.println("proxy 方法:"); Method methods[] = proxy.getClass().getDeclaredMethods(); for (Method m : methods) System.out.println(m.getName()); System.out.println("proxy 父类:"+proxy.getClass().getSuperclass()); System.out.println("proxy 接口:"+Arrays.toString(proxy.getClass().getInterfaces())); } }
转载:/article/5050689.html
http://paddy-w.iteye.com/blog/841798
http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
相关文章推荐
- Java静态代理和动态代理
- java学习笔记14--动态代理
- JAVA 动态代理
- java 动态代理
- java 静态代理 动态代理
- 公共技术点之 Java 动态代理
- java 动态代理
- java 动态代理
- JAVA 动态代理
- java 动态代理
- Java:静态代理 and 动态代理
- Java静态代理和动态代理
- java 动态代理
- [转]Java 静态代理和动态代理
- JAVA 动态代理
- java 高新技术【11.1】 动态代理类 InvocationHandler对象 (静态代理 与 动态代理 区别)
- java 动态代理
- java求不惑之 动态代理
- java 动态代理
- Java基础加强——动态代理