java可以动态生成一个类,就像Proxy类里所做的那样,看了源码之后发现看不懂,请大牛出来解释一下动态生成类的思路和原理

解决方案 »

  1.   

    说穿了就是拼字节码,读懂JAVA的CLASS文件的字节码规范,然后自己按规范拼一个一模一样的字节码,然后用ClassLoader的defineClass读入并生成就好了。 由于自己拼字节码这个事情非常繁琐非常2,就有很多框架来完成这个事情,比如著名的CGLIB想完全搞清楚,就只能啃CLASS字节码规范,没别的捷径。
    书籍的话推荐看周志明大神的JVM方面的书。
     
      

  2.   

    你可以看一本书,《深入Java虚拟机》,大致了解下就明白了。
      

  3.   

    动态生成类,还是类对象。
    你想动态写不存在的java类代码,我所知道那是不行的。
    当然你可以借助外部工具,就当前进程的java而言,应该是找不到这个类的。如果是生成类对象,那很easy!
      

  4.   

    是不是可以形象地比喻为 动态注入 注入内容是类的定义。defineClass
    protected final Class<?> defineClass(String name,
                                         byte[] b,
                                         int off,
                                         int len)
                                  throws ClassFormatError
    Converts an array of bytes into an instance of class Class. Before the Class can be used it must be resolved. 
    This method assigns a default ProtectionDomain to the newly defined class. The ProtectionDomain is effectively granted the same set of permissions returned when Policy.getPolicy().getPermissions(new CodeSource(null, null)) is invoked. The default domain is created on the first invocation of defineClass, and re-used on subsequent invocations. To assign a specific ProtectionDomain to the class, use the defineClass method that takes a ProtectionDomain as one of its arguments.字节数组b代表的是类的定义,可以在程序运行时动态注入,如果进一步涉及到平地字节码如何构建的问题,就要像楼上他们说的查阅jvm规范了。
      

  5.   

    JDK 的动态代码是根据 JVM 中 class 文件格式规范,在内存中创建一个 class 数据对象,再用当前的 ClassLoader 加载这个类。
      

  6.   

    在程序的执行过程中产生某个class文件,并将它作为装载来源。
    需要使用javax.tools.ToolProvider、JavaCompiler、JavaFileObject、StandardJavaFileManager等工具类
      

  7.   

    我知道了,java范畴是实现不了的,源代码里的生成这个类的方法是一个本地方法,谢各位