Java Proxy
来源:互联网 发布:保健品网络销售好做吗 编辑:程序博客网 时间:2024/06/05 12:45
接口(Advice):
package com.mth.Proxy;import java.lang.reflect.Method;public interface Advice { void beforMethod(Method method); void afterMethod(Method method);}
实现类:
package com.mth.Proxy;import java.lang.reflect.Method;public class AdviceImpl implements Advice { private long begin; @Override public void afterMethod(Method method) {long end = System.currentTimeMillis();System.out.println(method.getName()+"方法运行时间 "+(begin - end));System.out.println("after结束啦!"); } @Override public void beforMethod(Method method) {System.out.println("before开始啦!");begin = System.currentTimeMillis(); }}
代理:
package com.mth.Proxy;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ProxyTest { public static void main(String[] args) throws Exception {System.out.println("=============获取构造方法=================");Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) { String name = constructor.getName(); StringBuilder sb = new StringBuilder(name); sb.append("("); Class[] classes = constructor.getParameterTypes(); for (int i = 0; i < classes.length; i++) {sb.append(classes[i].getName());sb.append(","); } if (classes != null && classes.length != 0) {sb.deleteCharAt(sb.length() - 1); } sb.append(")"); // $Proxy0(java.lang.reflect.InvocationHandler) System.out.println(sb);}System.out.println("==============获取函数===================");Method[] Methods = clazz.getMethods();for (Method Method : Methods) { String name = Method.getName(); StringBuilder sb = new StringBuilder(name); sb.append("("); Class[] classes = Method.getParameterTypes(); for (int i = 0; i < classes.length; i++) {sb.append(classes[i].getName());sb.append(","); } if (classes != null && classes.length != 0) {sb.deleteCharAt(sb.length() - 1); } sb.append(")"); // $Proxy0(java.lang.reflect.InvocationHandler) System.out.println(sb);}System.out.println("==============通过构造创建实例对象===================");// 不能使用clazz.newInstance() 因为没有不带参数的构造方法// Constructor con2=clazz.getConstructors()[0];Constructor con = clazz.getConstructor(InvocationHandler.class);// 调用构造方法创建实例Collection proxy1 = (Collection) con.newInstance(new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return null; }});/** * 打印结果是null 两种可能:一种是toString 返回方法是null ;二种是 创建失败为对象null * * 结果是toString 是null 因为proxy1.clear()不报空指针异常 */System.out.println(proxy1);System.out.println("=================一步到位创建=====================");Collection proxy3=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),new Class[] {}, new InvocationHandler() { ArrayList target = new ArrayList(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(target, args); }});System.out.println("=================通用方法获取代理=====================");// 目标final ArrayList target = new ArrayList();//定义功能对象Advice advice = new AdviceImpl();Collection proxy2 = (Collection) getProxy(target, advice);proxy2.add("abc");proxy2.add("sss");proxy2.add("vvv");System.out.println(proxy2.size());// 下面这句话为什么没有调用invoke方法呢?/** * 因为Object上面的 hashCode equals toString交给Handler 其他方法都不交给Handler */// System.out.println(proxy2.getClass().getName()); } // 通用方法 private static Object getProxy(final Object target, final Advice advice) {Object proxy2 = Proxy.newProxyInstance(target.getClass().getClassLoader(),// new Class[] { Collection.class },target.getClass().getInterfaces(), new InvocationHandler() { // 代理对象 代理对象那个方法 代理对象方法的参数 // proxy2 方法add 参数"abc" @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// long begin = System.currentTimeMillis();// Object retVal = method.invoke(target, args);// long end = System.currentTimeMillis();// System.out.println(method.getName() + " "// + (begin - end));// return retVal;advice.beforMethod(method);Object retVal = method.invoke(target, args);advice.afterMethod(method);return retVal;/** * 下面这句话的意思是:在目标对象上面执行代理在执行的方法 ;传递给代理的参数,继续传递给目标。 */// return method.invoke(target, args); }});return proxy2; }}
0 0
- java Proxy
- JAVA Proxy
- java Proxy
- Java Proxy
- java proxy
- java Proxy
- java proxy
- java.lang.NoSuchMethodException: com.sun.proxy.$Proxy
- java实现proxy
- java 的 Proxy
- Java Dynamic Proxy
- java 代理(proxy)模式
- Java Proxy动态代理
- java Proxy 代理模式
- JAVA实现代理proxy
- Java 动态代理 Proxy
- JAVA Dynamic Proxy
- java代理Proxy
- 12计算机毕业设计
- 使用Navicat for Oracle新建表空间、用户及权限赋予
- RESTful 的webservice
- 开源项目:3D旋转动画Rotate3dAnimation.java
- Dojo-最佳实践如何防止浏览器内存泄露
- Java Proxy
- POJ 3258 River Hopscotch 二分答案
- Oracle RAC Failover 详解
- 单例模式&工厂模式(简介)
- 利用BeanUtils在对象间复制属性
- TCP/IP协议基础(总结)
- c++ 队列基本操作实现
- web前端设计
- Hibernate实战_笔记5(Hibernate、EJB3、JPA)