Используйте отражение для создания классов во время выполнения

1

Мне нужно создать список объектов, которые настроены в соответствии с именем некоторых классов, полученных в качестве входных данных.

Для каждого объекта я должен вызвать метод, который добавляет операцию, которая создается динамически.

Однако я не знаю точно, как решить проблему. См. Пример ниже.

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)
   }
});
Теги:
reflection

1 ответ

1
Лучший ответ

Как вы можете видеть из комментариев, окружающая инфраструктура и намерение не совсем ясны. Тем не менее, вы можете достичь определенной степени безопасности типа с помощью "вспомогательного" метода, который фиксирует тип заданной Task и позволяет вам работать с этим типом внутри:

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню