[英]class at runtime
有没有办法在运行时创建Java类@(类方法和变量),使用Java反射API
你不能用反射做到这一点。 您需要一个字节码操作库,如Jakarta BCEL 。
标准Java API提供了一组静态方法,允许您动态创建实现一个(或多个)接口的类。 这些方法是java.lang.reflect.Proxy类的一部分。
你需要这个什么?
在一个非常松散的庄园里解释这个问题我可以想到四个可能的选择。
如果你有一个类,你也可以添加一些东西,你可能会发现面向Aspect的编程就是你真正想要的。
如果你有一个你想要动态实现的接口(由barjak发布)你想要的是java.lang.reflect.Proxy
。 这不允许在运行时创建“代码”,而是允许您将现有代码链接到接口。
最后(我知道三个)你实际上已经在运行时构建了随机类。 这需要像cglib或BCEL这样的东西。 虽然有些情况需要这样,但IMO很少见。
另一个选择是你不需要运行时而是需要构建时间。 在这种情况下,您可以使用注释和apt
(Java 5)/ Processor
(Java 6)。
你可以使用javassist。 这是sudo代码
javassist.ClassPool pool = new ClassPool(true);
CtClass bclass = pool.makeClass("brandnewclass);
bclass.addConstructor(CtNewConstructor.defaultConstructor(bclass));
CtClass[] fieldclasses = new CtClass[fields.length];
CtClass serClass = pool.get(Serializable.class.getName());
bclass.addInterface(serClass);
class clazz = pool.loadClass(“className”); obj = clazz.newInstance();
使用反射从现有类中提取值并将值分配给新类。 希望这可以帮助。 戈皮
当然有。 对于要创建的目标类,最初需要一个java.lang.Class实例。 根据您的结构,这可能由调用者传入(如果他们提供他们想要创建的具体类),或者您可以静态访问类变量(例如MyFooImpl.class
)。
最简单的方法是调用Class.newInstance() 。 这将调用默认的no-arg构造函数(假设该类有一个;如果不是,则抛出异常)。
如果需要使用某个参数调用特定构造函数,则需要调用Class.getConstructor()以获取Constructor实例,然后可以调用newInstance 。
在所有情况下,您都需要处理直接调用构造函数时无法获得的反射异常。
大编辑 :我假设你的问题是关于通过反射创建一个类的实例。 但是我开始认为你要求在运行时定义新的类。 如果是这样,那么反射在这里不会帮助你 - 你需要以编程方式调用编译器,我相信可以这样做,但我不是100%的细节。 我想你也必须通过一些箍来让ClassLoader接收你的新课程。
您可以使用Janino创建源代码字符串并将其编译为类文件。
正如人们已经提到的那样,没有办法在运行时使用反射创建新类。 我知道的一个库被不同的模拟库使用,例如cglib 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.