Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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,我必须创建一个对象列表,这些对象根据作为输入接收的某些类的名称进行配置 对于每个对象,我必须调用一个方法,该方法添加一个动态创建的操作 然而,我不知道该如何解决这个问题。 请参见下面的示例 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的工作方式。如果您创建了它们,您可能可以整理一些东西,但是我不确定您是否能够在没有某种“插装”的情况下实际注入方法和字段,我恐怕我无能为力。