Se eu tiver duas variáveis:
Object obj;
String methodName = "getName";
Sem conhecer a classe de obj
, como posso chamar o método identificado por methodName
ela?
O método que está sendo chamado não possui parâmetros e um String
valor de retorno. É um getter para um bean Java .
java
reflection
invoke
brasskazoo
fonte
fonte
Respostas:
Codificação a partir do quadril, seria algo como:
Os parâmetros identificam o método muito específico que você precisa (se houver vários sobrecarregados disponíveis, se o método não tiver argumentos, apenas forneça
methodName
).Então você invoca esse método chamando
Novamente, deixe de fora os argumentos
.invoke
, se você não tiver nenhum. Mas sim. Leia sobre Java Reflectionfonte
method
inmethod.invoke(obj, arg1, arg2,...);
. amethod = null;
resolve o problema, mas mencioná-lo na resposta não é uma má idéia.invoke
retornará o que foi retornado. Se ocorrer uma exceção ao executar o método, a exceção será agrupada em umInvocationTargetException
.Use a invocação de método da reflexão:
Onde:
"class name"
é o nome da classeobjectToInvokeOn
é do tipo Object e é o objeto em que você deseja chamar o método"method name"
é o nome do método que você deseja chamarparameterTypes
é do tipoClass[]
e declara os parâmetros que o método levaparams
é do tipoObject[]
e declara os parâmetros a serem passados para o métodofonte
Para aqueles que desejam um exemplo de código direto no Java 7:
Dog
classe:ReflectionDemo
classe:Resultado:
Mishka is 3 year(s) old.
Você pode chamar o construtor com parâmetros desta maneira:
Como alternativa, você pode remover
e fazer
Leitura sugerida: Criando novas instâncias de classe
fonte
Method
objetos?O método pode ser chamado assim. Existem também mais possibilidades (verifique a API de reflexão), mas esta é a mais simples:
fonte
Primeiro não. Evite esse tipo de código. Também tende a ser um código muito ruim e inseguro (consulte a seção 6 das Diretrizes de codificação segura para a linguagem de programação Java, versão 2.0 ).
Se você precisar fazer isso, prefira java.beans à reflexão. O feijão envolve a reflexão, permitindo acesso relativamente seguro e convencional.fonte
Para concluir as respostas do meu colega, preste muita atenção a:
Aqui está um código java1.4 antigo que leva em conta esses pontos:
fonte
fonte
fonte
Se você fizer a chamada várias vezes, poderá usar os novos manipuladores de métodos introduzidos no Java 7. A seguir, o método retornará uma String:
fonte
invokeExact
sempre que puder. Para isso, a assinatura do site de chamada deve corresponder exatamente ao tipo de identificador do método. Geralmente, é preciso um pouco de ajustes para chegar ao trabalho. Nesse caso, você precisaria converter o primeiro parâmetro com:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
e depois chamar comoString result = (String) methodHandle.invokeExact(obj);
Isso soa como algo factível com o pacote Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Particularmente em Invocando métodos por nome:
importar java.lang.reflect. *;
fonte
Indexação (mais rápida)
Você pode usar
FunctionalInterface
para salvar métodos em um contêiner para indexá-los. Você pode usar o contêiner de matriz para invocá-los por números ou o hashmap para invocá-los por seqüências de caracteres. Com esse truque, você pode indexar seus métodos para invocá-los dinamicamente mais rapidamente .Sintaxe Lambda
Você também pode usar a sintaxe lambda:
fonte
O(1)
.SomeClass
é a classe esomeVariable
é uma variávelfonte
Eu faço assim:
fonte
Consulte o seguinte código pode ajudá-lo.
Obrigado....
fonte
Aqui estão os métodos PRONTOS PARA USAR:
Para invocar um método, sem argumentos:
Para invocar um método, com Argumentos:
Use os métodos acima como abaixo:
Resultado:
fonte
Student.java
StudentTest.java
fonte
Você deve usar reflexão - inicie um objeto de classe, depois um método nesta classe e, em seguida, invoque esse método em um objeto com parâmetros opcionais . Lembre-se de agrupar o seguinte snippet no bloco try-catch
Espero que ajude!
fonte
Isso está funcionando bem para mim:
}
Resultado:
My input testparam
Eu sou capaz de invocar o método passando seu nome para outro método (como principal).
fonte
usando
import java.lang.reflect.*;
e aqui está como você o usa:
fonte
Com o jooR , é apenas:
Aqui está um exemplo mais elaborado:
Isso imprime:
fonte
para mim, uma maneira bastante simples e à prova de idiotas seria simplesmente criar um método de chamada de método assim:
então, quando você precisar chamar o método, basta colocar algo assim
fonte
className.getName().toString()
? Você está perdendo todo o ponto de reflexão.