繁体   English   中英

运行时的类

[英]class at runtime

有没有办法在运行时创建Java类@(类方法和变量),使用Java反射API

你不能用反射做到这一点。 您需要一个字节码操作库,如Jakarta BCEL

标准Java API提供了一组静态方法,允许您动态创建实现一个(或多个)接口的类。 这些方法是java.lang.reflect.Proxy类的一部分。

你需要这个什么?

在一个非常松散的庄园里解释这个问题我可以想到四个可能的选择。

如果你有一个类,你也可以添加一些东西,你可能会发现面向Aspect的编程就是你真正想要的。

如果你有一个你想要动态实现的接口(由barjak发布)你想要的是java.lang.reflect.Proxy 这不允许在运行时创建“代码”,而是允许您将现有代码链接到接口。

最后(我知道三个)你实际上已经在运行时构建了随机类。 这需要像cglibBCEL这样的东西。 虽然有些情况需要这样,但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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM