论坛首页 Java企业应用论坛

AOP的实现机制

浏览 130421 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-10-20  
刚好补充一下。
0 请登录后投票
   发表时间: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());
  }
}

0 请登录后投票
   发表时间:2011-10-20  
多谢楼主   !!!
0 请登录后投票
   发表时间:2011-10-21  
楼主你太用心了, 我要是不顶下显的都不厚道了!! 谢谢分享。
0 请登录后投票
   发表时间:2011-10-21  
抠代码的高手,果断收藏.
0 请登录后投票
   发表时间:2011-10-21  
写得挺好的 楼主的分享精神值得学习!
0 请登录后投票
   发表时间:2011-10-23  
楼主写的很详细,很不错
0 请登录后投票
   发表时间:2011-11-10  
ProxyGenerator.generateProxyClass()方法属于sun.misc包下,Oracle并没有提供源代码,但是我们可以使用JD-GUI这样的反编译软件打开jre\lib\rt.jar来一探究竟,以下是其核心代码的分析。 


其实sun公司已经提供了代码了。搜索一下 jdk-1_5_0-src-scsl就可以找到,同时 openjdk中也是提供了源代码。。

0 请登录后投票
   发表时间:2011-11-15  
学习了一下。虽然之前也大概看过AOP,不过这次又有新的体会。感谢楼主
0 请登录后投票
   发表时间:2011-11-16  
很详细,慢慢复习,学习
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics