java动态代理
来源:互联网 发布:杜冷丁多少钱一支淘宝 编辑:程序博客网 时间:2024/06/06 06:48
最近复习了一下java动态代理
jdk中提供了java.lang.reflect.Proxy方法来为接口创建动态代理(Proxy只能为接口生成动态代理)
参与成员:
自己定义的接口类
接口类的实现类
定义一个类实现java.lang.reflect.InvocationHandler接口
,这个类应该有一个接口类的成员变量
实现invoke方法,做特定操作,并调用实际的接口类实现对象的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("enter into " + method.getName()); Object result = null; if(method!=null){ result=method.invoke(foo,args) ; } System.out.println("exit the method"+method.getName()); return result;}
调用类
Foo newFoo= new FooImpl(10);LogInvocationHandler handler = new LogInvocationHandler(newFoo);Class<?>[] interfaces=new Class<?>[]{Foo.class};Foo proxy= (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),interfaces,handler);proxy.add(2);proxy.调用方法newProxyInstance为接口创建一个动态的代理类产生这个类字节码的是sun.misc.ProxyGenerator类,通过调用其generateProxyClass来产生这个字节码
如果像查看运行过程中产生的类字节码需要设置System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");这样在com/sun/proxy下可以见到其字节码文件,使用jd-gui对其反编译,可以见到其所有的方法都是转调用handler的invoke方法public final class $Proxy0 extends Proxy implements Foo{ private static Method m1; private static Method m5; private static Method m3; private static Method m2; private static Method m4; private static Method m0; public $Proxy0(InvocationHandler paramInvocationHandler) throws { super(paramInvocationHandler); } public final boolean equals(Object paramObject) throws { try { return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue(); } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final void minus(int paramInt) throws { try { this.h.invoke(this, m5, new Object[] { Integer.valueOf(paramInt) }); return; } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final void add(int paramInt) throws { try { this.h.invoke(this, m3, new Object[] { Integer.valueOf(paramInt) }); return; } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final String toString() throws { try { return (String)this.h.invoke(this, m2, null); } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final int getValue() throws { try { return ((Integer)this.h.invoke(this, m4, null)).intValue(); } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } public final int hashCode() throws { try { return ((Integer)this.h.invoke(this, m0, null)).intValue(); } catch (Error|RuntimeException localError) { throw localError; } catch (Throwable localThrowable) { throw new UndeclaredThrowableException(localThrowable); } } static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m5 = Class.forName("*.Foo").getMethod("minus", new Class[] { Integer.TYPE }); m3 = Class.forName("*.Foo").getMethod("add", new Class[] { Integer.TYPE }); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); m4 = Class.forName("*.Foo").getMethod("getValue", new Class[0]); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); return; } catch (NoSuchMethodException localNoSuchMethodException) { throw new NoSuchMethodError(localNoSuchMethodException.getMessage()); } catch (ClassNotFoundException localClassNotFoundException) { throw new NoClassDefFoundError(localClassNotFoundException.getMessage()); } }}
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- catalan数
- 进制总结
- 5个经典的JavaScript面试基础问题
- iOS 事件响应链详解(The Responder Chain)
- hg 使用介绍网站
- java动态代理
- 基于apache.tools.zip压缩文件(夹)
- 【DataGuard】由于备库参数设置不当导致数据文件无法添加的故障分析
- IOS Post请求与GET请求
- java 队列
- 2016兰亭校招C++
- casperjs中Selectors使用总结
- Eclipse安装Maven插件
- PHP上传文件