java 之 动态代理学习示例
来源:互联网 发布:java xml与java关联 编辑:程序博客网 时间:2024/04/29 03:22
import java.lang.reflect.Method;public interface Advice {public void beforeMethod(Method method);public void afterMethod(Method method);}
import java.lang.reflect.Method;public class MyAdvice implements Advice {long beginTime = 0;public void beforeMethod(Method method) {System.out.println("start.........................");beginTime = System.currentTimeMillis();}public void afterMethod(Method method) {System.out.println("end...........................");long endTime = System.currentTimeMillis();System.out.println(method.getName()+" running time of "+(endTime-beginTime));}}
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;import org.omg.CORBA.portable.InvokeHandler;public class ProxyTest {/** * 创建动态代理类 * 查看其方法列表信息 * class Proxy${ * InvocationHandler handler; * add(Object object) { * return handler.invoke(Object proxy,Method method, Object[] args); * } * } * hashCode,equals,toString 委托给了handler,invoke调用,return null * @param args * @throws Exception */public static void main(String[] args) throws Exception {//拿到代理类字节码Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);//拿到构造方法Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);class MyInvocationHandler implements InvocationHandler {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return null;}}//实例化代理对象/*Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHandler());//invocationHandler Proxy类里实现的toString() invoke--->return null;//此处结果:null. proxy1!=nullSystem.out.println(proxy1);proxy1.clear();*///此处报错,因为invoke放回的是null,相当于void,而size方法是有返回值的// java.lang.NullPointerException//proxy1.size();/*Collection proxy2 = (Collection) constructor.newInstance(new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn null;}});*//*Collection proxy3 = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), new Class[]{Collection.class},new InvocationHandler() {ArrayList<String> arrayList = new ArrayList<String>();@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {long beginTime = System.currentTimeMillis();Object retVal = method.invoke(arrayList, args);long endTime = System.currentTimeMillis();System.out.println(method.getName()+" is running of "+(endTime-beginTime));return retVal;}});proxy3.add("aaa");proxy3.add("bbb");proxy3.add("ccc");System.out.println(proxy3.size());*/final ArrayList target = new ArrayList();Collection proxy4 = (Collection) getProxy(target, new MyAdvice());proxy4.add("aaa");System.out.println(proxy4.size());System.out.println(proxy4.getClass().getName());}public static void getMethodList() {//代理类字节码Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);System.out.println(clazzProxy1);System.out.println("------------------------构造方法列表-----------------------------");//代理类构造方法Constructor[] constructors = clazzProxy1.getConstructors();for(Constructor constructor:constructors) {String name = constructor.getName();StringBuilder sBuilder = new StringBuilder(name);sBuilder.append('(');Class[] clazzParams = constructor.getParameterTypes();for(Class clazzParam:clazzParams) {sBuilder.append(clazzParam.getName()).append(",");}if(clazzParams!=null&&clazzParams.length!=0) {sBuilder.deleteCharAt(sBuilder.length()-1);}sBuilder.append(')');//打印各个构造方法System.out.println(sBuilder.toString());}System.out.println("------------------------方法列表-----------------------------");//代理类构造方法Method[] methods = clazzProxy1.getMethods();for(Method method:methods) {String name = method.getName();StringBuilder sBuilder = new StringBuilder(name);sBuilder.append('(');Class[] clazzParams = method.getParameterTypes();for(Class clazzParam:clazzParams) {sBuilder.append(clazzParam.getName()).append(",");}if(clazzParams!=null&&clazzParams.length!=0) {sBuilder.deleteCharAt(sBuilder.length()-1);}sBuilder.append(')');//打印各个构造方法System.out.println(sBuilder.toString());}}public static Object getProxy(final Object target, final Advice advice) {Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {advice.beforeMethod(method);Object retVal = method.invoke(target, args);advice.afterMethod(method);return retVal;}});return proxy;}}
advice 把执行逻辑封装到一个类里边,AOP的做法。
- java 之 动态代理学习示例
- Java 动态代理示例
- JAVA学习之动态代理
- JAVA学习之动态代理
- JAVA学习之动态代理
- Java动态代理示例代码
- Java动态代理示例代码
- Java 动态代理简单示例
- java学习笔记之动态代理
- 【java-之路】学习动态代理[基础]
- java学习笔记之动态代理
- Java学习之反射机制---动态代理
- java反射之动态代理学习笔记
- Java 代理之 动态代理
- java 动态代理学习
- java动态代理学习
- java动态代理学习
- Java动态代理学习
- 七号信令:SCCP层简介
- linux的调度分析
- 分享响应式设计(responsive design)的超强手册参考:工具,教程和实例
- C#连接六类数据库的代码集
- JS 判断是否为IP格式
- java 之 动态代理学习示例
- 做IT苦逼有没有?挨踢,现在都要挨应届生踢了。
- 基于移动平台的多媒体框架——使用live555接收流媒体方法简介
- 黑马程序员__基础加强
- DOM技术简介之一_什么是DOM
- HTML 后退、刷新、前进按钮
- 不对窗体进行边框装饰后,实现对鼠标事件的监控
- 解析C语言中的sizeo
- 不想当将军的士兵-不服从的士兵