锁定老帖子 主题:AOP的实现机制
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-20
刚好补充一下。
|
|
返回顶楼 | |
发表时间:2011-10-20
最后修改:2011-10-20
wuhuajun 写道 刚在代码中找到了这个
为什么找不到生成的文件????? 的确生成不了,因为默认是不生成字节码的。saveGeneratedFiles=false。看下面这段代码: if (saveGeneratedFiles) { AccessController.doPrivileged(new PrivilegedAction(paramString, arrayOfByte) { public Object run() { try { FileOutputStream localFileOutputStream = new FileOutputStream(ProxyGenerator.access$000(this.val$name) + ".class"); localFileOutputStream.write(this.val$classFile); localFileOutputStream.close(); return null; } catch (IOException localIOException) { } throw new InternalError("I/O exception saving generated file: " + localIOException); } }); } 如果要生成需要设置saveGeneratedFiles=true,设置代码如下,应该是要修改配置文件,我没研究出来怎么设。 saveGeneratedFiles = ((Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.misc.ProxyGenerator.saveGeneratedFiles"))).booleanValue(); 但我把动态代理里通过接口生产实例字节码copy出来生成了一下,代码如下: //通过接口获取实例的字节码 byte[] proxyClassFile = ProxyGenerator.generateProxyClass( "BusinessProxy", new Class[]{IBusiness.class}); //输出字节码 try { FileOutputStream localFileOutputStream = new FileOutputStream("BusinessProxy.class"); localFileOutputStream.write(proxyClassFile); localFileOutputStream.close(); } catch (IOException localIOException) { } 生成的字节码如下为: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import model.IBusiness; public final class BusinessProxy extends Proxy implements IBusiness { private static Method m3; private static Method m1; private static Method m0; private static Method m2; public BusinessProxy(InvocationHandler paramInvocationHandler) throws { super(paramInvocationHandler); } public final boolean doSomeThing() throws { try { return ((Boolean)this.h.invoke(this, m3, null)).booleanValue(); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { } throw new UndeclaredThrowableException(localThrowable); } public final boolean equals(Object paramObject) throws { try { return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue(); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { } throw new UndeclaredThrowableException(localThrowable); } public final int hashCode() throws { try { return ((Integer)this.h.invoke(this, m0, null)).intValue(); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { } throw new UndeclaredThrowableException(localThrowable); } public final String toString() throws { try { return (String)this.h.invoke(this, m2, null); } catch (RuntimeException localRuntimeException) { throw localRuntimeException; } catch (Throwable localThrowable) { } throw new UndeclaredThrowableException(localThrowable); } static { try { m3 = Class.forName("model.IBusiness").getMethod("doSomeThing", new Class[0]); m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); return; } catch (NoSuchMethodException localNoSuchMethodException) { throw new NoSuchMethodError(localNoSuchMethodException.getMessage()); } catch (ClassNotFoundException localClassNotFoundException) { } throw new NoClassDefFoundError(localClassNotFoundException.getMessage()); } } |
|
返回顶楼 | |
发表时间:2011-10-20
多谢楼主 !!!
|
|
返回顶楼 | |
发表时间:2011-10-21
楼主你太用心了, 我要是不顶下显的都不厚道了!! 谢谢分享。
|
|
返回顶楼 | |
发表时间:2011-10-21
抠代码的高手,果断收藏.
|
|
返回顶楼 | |
发表时间:2011-10-21
写得挺好的 楼主的分享精神值得学习!
|
|
返回顶楼 | |
发表时间:2011-10-23
楼主写的很详细,很不错
|
|
返回顶楼 | |
发表时间:2011-11-10
ProxyGenerator.generateProxyClass()方法属于sun.misc包下,Oracle并没有提供源代码,但是我们可以使用JD-GUI这样的反编译软件打开jre\lib\rt.jar来一探究竟,以下是其核心代码的分析。
其实sun公司已经提供了代码了。搜索一下 jdk-1_5_0-src-scsl就可以找到,同时 openjdk中也是提供了源代码。。 |
|
返回顶楼 | |
发表时间:2011-11-15
学习了一下。虽然之前也大概看过AOP,不过这次又有新的体会。感谢楼主
|
|
返回顶楼 | |
发表时间:2011-11-16
很详细,慢慢复习,学习
|
|
返回顶楼 | |