java动态生成类的原理

昵称无法识别 2013-02-06 11:32:15
java可以动态生成一个类,就像Proxy类里所做的那样,看了源码之后发现看不懂,请大牛出来解释一下动态生成类的思路和原理
...全文
5776 点赞 收藏 9
写回复
9 条回复
昵称无法识别 2013年02月21日
我知道了,java范畴是实现不了的,源代码里的生成这个类的方法是一个本地方法,谢各位
回复 点赞
yqj2065 2013年02月18日
在程序的执行过程中产生某个class文件,并将它作为装载来源。 需要使用javax.tools.ToolProvider、JavaCompiler、JavaFileObject、StandardJavaFileManager等工具类
回复 点赞
火龙果被占用了 2013年02月12日
JDK 的动态代码是根据 JVM 中 class 文件格式规范,在内存中创建一个 class 数据对象,再用当前的 ClassLoader 加载这个类。
回复 点赞
花谢尊前不敢香 2013年02月07日
lz想要的是动态生成类的原理?而不是动态代理?那估计没办法了
回复 点赞
silenceburn 2013年02月06日
说穿了就是拼字节码,读懂JAVA的CLASS文件的字节码规范,然后自己按规范拼一个一模一样的字节码,然后用ClassLoader的defineClass读入并生成就好了。 由于自己拼字节码这个事情非常繁琐非常2,就有很多框架来完成这个事情,比如著名的CGLIB 想完全搞清楚,就只能啃CLASS字节码规范,没别的捷径。 书籍的话推荐看周志明大神的JVM方面的书。
回复 点赞
龙四 2013年02月06日






回复 点赞
是不是可以形象地比喻为 动态注入 注入内容是类的定义。 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规范了。
回复 点赞
blliy117 2013年02月06日
动态生成类,还是类对象。 你想动态写不存在的java类代码,我所知道那是不行的。 当然你可以借助外部工具,就当前进程的java而言,应该是找不到这个类的。 如果是生成类对象,那很easy!
回复 点赞
healer_kx 2013年02月06日
你可以看一本书,《深入Java虚拟机》,大致了解下就明白了。
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告