2015-03-14 2 views
1

У меня есть требование, в котором мне нужно вызвать метод из класса в определенном шаблоне, который получается в качестве входного аргумента.Динамически вызывать метод из другого класса

public RandomMethod(String ClassName){ 
     //Eg For Class Name Abc , there is a method AbcProcessor which i need to invoke 
     ClassName.ClassNameProcessor  
     } 

Поскольку я получаю аргумент в виде строки, я не могу понять, как бросить строку в форму, где я могу назвать что-то вроде Abc.AbcProcessor()

Я считаю, это способ сделать это с помощью отражений. Но я не уверен, как действовать дальше.

+0

Читайте на [отражения] (http://docs.oracle.com/javase/tutorial/reflect/). –

+0

Использовать поисковую систему и искать 'java reflection static method' – Augusto

+1

Почему бы вам не сделать классы' Singletons' и позволить им реализовать интерфейс с методом 'process()' defined? Затем вы можете передать экземпляр singleton и вызвать 'singleton.process()'. – Clashsoft

ответ

1

при отражении вы можете сделать это, попробуйте следующий пример:

Класс A:

public class A { 
    public void print(){ 
     System.out.println("A"); 
    } 
} 

Класс B:

public class B { 
    public void print(){ 
     System.out.println("B"); 
    }  
} 

Вызов print() из A и B:

public class Test { 

    public static void callPrint(String className){ 
     try { 
      Class clazz = Class.forName(className); 
      Object obj = clazz.newInstance(); 
      clazz.getDeclaredMethod("print").invoke(obj); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     callPrint("test.A"); 
     callPrint("test.B"); 
    } 
} 
1

Вы должны использовать reflecton, действительно:

public void randomMethod(String fullyQualifiedClassName, String methodName) throws ReflectiveOperationException { 
    Class<?> clazz = Class.forName(fullyQualifiedClassName); 

    clazz.getMethod(methodName).invoke(null); 
} 

, который будет работать если вы вызываете общественный статический метод без аргументов

+1

Это не работает. Имя класса должно быть квалифицированным (с именем пакета), и этот метод не всегда называется 'AbcProcessor'. – Clashsoft

+0

Конечно, полное имя. Технически корректное двоичное имя. Исправьте аргумент methodName. Это не очевидно из его описания. – Crazyjavahacking

+0

Это, кажется, работает частично, но я получаю исключение NullPointer, поскольку я передаю null в качестве аргумента для вызова. Любая работа вокруг этого –

Смежные вопросы