Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时初始化_Java_Reflection - Fatal编程技术网

Java 在运行时初始化

Java 在运行时初始化,java,reflection,Java,Reflection,有没有办法在运行时创建Java类@ (类方法n个变量),并使用Java反射API确保存在。对于要创建的目标类,最初需要一个java.lang.Class实例。根据您的结构,这可能由调用者传入(如果他们提供想要创建的具体类),或者您可以静态访问类变量(例如MyFooImpl.class) 最简单的方法是打电话。这将调用默认的无参数构造函数(假定类有一个构造函数;如果没有,则抛出异常) 如果需要使用某个参数调用特定的构造函数,则需要调用以获取构造函数实例,然后可以调用该实例 在所有情况下,您都需要处

有没有办法在运行时创建Java类@
(类方法n个变量),并使用Java反射API确保存在。对于要创建的目标类,最初需要一个java.lang.Class实例。根据您的结构,这可能由调用者传入(如果他们提供想要创建的具体类),或者您可以静态访问类变量(例如
MyFooImpl.class

最简单的方法是打电话。这将调用默认的无参数构造函数(假定类有一个构造函数;如果没有,则抛出异常)

如果需要使用某个参数调用特定的构造函数,则需要调用以获取构造函数实例,然后可以调用该实例

在所有情况下,您都需要处理反射异常,如果直接调用构造函数,将无法获得这些异常


大编辑:我假设您的问题是关于通过反射创建类的实例。然而,我开始认为您正在询问如何在运行时通过定义新类。如果是这样,那么反射在这里就帮不了你——你需要通过编程调用编译器,我相信这是可以做到的,但我不是100%了解细节。我认为您还必须经历一些困难,才能让类加载器也选择您的新类。

使用反射无法做到这一点。您需要一个字节码操作库,如。

您可以创建源代码字符串并使用编译将其编译为类文件。

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

正如人们已经提到的,在运行时无法使用反射创建新类。我知道有一个库被不同的模拟库和类似的库使用。

您需要它做什么

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

如果你有一个类,你添加了一些东西,你可能会发现这是你真正想要的

如果您有一个想要动态实现的接口(如发布者所示),那么您想要的就是。这不允许在运行时创建“代码”,而是允许将现有代码链接到接口

最后(我知道是三点),您实际上已经在运行时构建了随机类。这将需要类似或的东西。虽然在某些情况下需要这样做,但在我看来这是罕见的


另一个选择是,您并不真正需要运行时,而是需要构建时间。在本例中,您可能可以使用and(Java5)/(Java6)。

您可以使用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()

使用反射从现有类中提取值并将值分配给新类。 希望这有帮助。
Gopi

是的,但这是现有类从中创建对象的方法,我想创建一个类。教程中有一个很好的例子。看一看:.+1-正准备说同样的话,生成字节码应该只在极少数情况下才真正需要。我还将添加脚本API()添加到1.6中,但最终您的决定可能会受到如何定义“类”行为的指导。我忘记了脚本API,但这是一个很好的观点。