Chamando um método estático usando reflexão

198

Eu quero invocar o mainmétodo que é estático. Eu peguei o objeto do tipo Class, mas não consigo criar uma instância dessa classe e também não consigo invocar o staticmétodo main.

Steven
fonte

Respostas:

290
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

Caso o método seja de uso privado, em getDeclaredMethod()vez de getMethod(). E chame setAccessible(true)o objeto de método.

Adeel Ansari
fonte
49

No Javadoc do Method.invoke ():

Se o método subjacente for estático, o argumento obj especificado será ignorado. Pode ser nulo.

O que acontece quando você

Classe klass = ...;
Método m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (nulo, argumentos)
atk
fonte
13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}
Frostman
fonte
11
Por que não usar getMethod com o nome correto em vez de percorrer todos os métodos?
Mjaggard 17/04
11
Às vezes, é muito mais fácil fazer um loop e encontrar o método pelo nome do que usar getMethod, porque getMethod (ou getDeclaredMethod) exige que você trabalhe com detalhes os tipos de parâmetros. Depende apenas se as questões micro eficiência - Java iteração é muito rápido a menos que você está chamando os milhões de método de vezes em algum laço interno, em seguida, iteração será rápido o suficiente
Tony Eastwood
2
Também em uma situação mais real, você provavelmente encontraria o método apenas uma vez, mesmo se usar a reflexão para invocá-lo várias vezes. Tão sobrecarga extra quando achar que é imaterial.
RenniePet
4
Mas vou me divertir com métodos sobrecarregados.
Ulysse Mizrahi 28/09
1
@UlysseMizrahi tudo depende do que você combina, mas sim, se você estiver escrevendo um código de biblioteca, pode ser perigoso confiar apenas no nome. Normalmente, procuro uma anotação específica ou uma assinatura de método específica, como "método estático que pega uma String e retorna uma instância da classe" e, em seguida, afirmo que apenas um desses métodos foi encontrado.
cobbzilla
0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

No exemplo acima, 'add' é um método estático que aceita dois números inteiros como argumentos.

O snippet a seguir é usado para chamar o método 'add' com as entradas 1 e 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Link de referência .

Hari Krishna
fonte