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.

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.


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)

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

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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.