Java 使用反射在运行时创建类
我必须创建一个对象列表,这些对象根据作为输入接收的某些类的名称进行配置 对于每个对象,我必须调用一个方法,该方法添加一个动态创建的操作 然而,我不知道该如何解决这个问题。 请参见下面的示例Java 使用反射在运行时创建类,java,reflection,Java,Reflection,我必须创建一个对象列表,这些对象根据作为输入接收的某些类的名称进行配置 对于每个对象,我必须调用一个方法,该方法添加一个动态创建的操作 然而,我不知道该如何解决这个问题。 请参见下面的示例 String className; // this is an input parameter final Class<?> classType = Class.forName(className); // here I would like to use classType instead
String className; // this is an input parameter
final Class<?> classType = Class.forName(className);
// here I would like to use classType instead of "?" but it gives me an error.
Task<?> task = TaskFactory.createTask((String)classType.getField("_TYPE").get(null)));
tasks.put(task, null);
task.addOperation(new Operation<classType>() { // this gives an error
@Override
public void onNewInput(classType input) { // this gives an error
System.out.println(input)
}
});
String className;//这是一个输入参数
最终类classType=Class.forName(className);
//这里我想使用classType而不是“?”,但它给了我一个错误。
任务Task=TaskFactory.createTask((字符串)classType.getField(“_TYPE”).get(null));
tasks.put(task,null);
task.addOperation(new Operation(){//这会给出一个错误
@凌驾
public void onNewInput(类类型输入){//这给出了一个错误
系统输出打印项次(输入)
}
});
从评论中可以看出,周围的基础设施和意图并不完全清楚。但是,您可以使用“助手”方法实现某种程度的类型安全,该方法捕获给定任务的类型,并允许您在内部使用此类型:
public class RuntimeType
{
public static void main(String[] args) throws Exception
{
String className = "";
final Class<?> classType = Class.forName(className);
Task<?> task = TaskFactory.createTask((String)classType.getField("_TYPE").get(null));
addOperation(task);
}
private static <T> void addOperation(Task<T> task)
{
task.addOperation(new Operation<T>()
{
@Override
public void onNewInput(T input)
{
System.out.println(input);
}
});
}
}
class TaskFactory
{
public static Task<?> createTask(String string)
{
return null;
}
}
class Task<T>
{
public void addOperation(Operation<T> operation)
{
}
}
interface Operation<T>
{
void onNewInput(T input);
}
公共类运行时类型
{
公共静态void main(字符串[]args)引发异常
{
字符串className=“”;
最终类classType=Class.forName(className);
TaskTask=TaskFactory.createTask((字符串)classType.getField(“_TYPE”).get(null));
添加操作(任务);
}
私有静态void addOperation(任务)
{
task.addOperation(新操作()
{
@凌驾
公共输入(T输入)
{
系统输出打印项次(输入);
}
});
}
}
类任务工厂
{
公共静态任务createTask(字符串)
{
返回null;
}
}
课堂任务
{
公共无效添加操作(操作)
{
}
}
接口操作
{
无效输入(T输入);
}
什么是任务、任务工厂和操作?classType
不是类型,而是类class
的实例。您试图创建一个匿名类,newoperation
,这是一个错误,因为Java泛型与类型一起工作。编译时已知类型的代码等价于新操作
(这是一个错误)。@Ray任务和操作是抽象接口。TaskFactory是一个类。@AndreasTroelsen谢谢。那么,是否可以用不同的方式做一些事情呢?@Maverik这取决于任务、操作和TaskFactory的工作方式。如果您创建了它们,您可能可以整理一些东西,但是我不确定您是否能够在没有某种“插装”的情况下实际注入方法和字段,我恐怕我无能为力。