Em java há a possibilidade de executar um método pelo nome.
exemplo:
final String nome = “metodoAntes”;
public stati void metodoAntes(){…}
consigo executar ?
Como ?
Em java há a possibilidade de executar um método pelo nome.
exemplo:
final String nome = “metodoAntes”;
public stati void metodoAntes(){…}
consigo executar ?
Como ?
Que eu sei a maneira de executar metodos e assim:
public static String Teste(){…}
String nome=Teste();
Olha este exeplo:
package br.edu.guj.java;
/**
* @autor mirla.braga
* @since 18/07/2007
*/
public class ExemploGUJ {
public static void main(String[] args) {
metodo1();
}
private static void metodo1() {
metodo2();
}
private static void metodo2() {
ExemploGUJ exemplo = new ExemploGUJ();
exemplo.metodo3();
}
private void metodo3() {
System.out.println("Guj");
}
}
O que ele quis dizer é que apartir de um parâmetro ( provavelmente uma string ) ele consiga identificar e executar um método.
Teste.java
public class Teste {
public static void main(String args[]){
for(String textoAExecutar: args){
executaMetodo(textoAExecutar);
}
}
private void executaMetodo(String aExecutar){
// Faz algo que não sei como para encontrar e executar o metodo
}
private void metodoAChamar(){
// Faz o que tiver que fazer
}
}
java Teste metodoAExecutar metodoQueNaoTem
Sem um monte de ifs, que eu me lembre não, mas deve haver alguém que saiba fazer algo parecido.
Até!
public class MyClass {
public static void myStaticMethod() {}
public void myMethod() {}
}
public class Test {
public static void main( String[] bananinha ) throws Exception {
Method staticMethod = MyClass.class.getMethod( "myStaticMethod" );
staticMethod.invoke();
Method method = MyClass.class.getMethod( "myMethod" );
method.invoke( new MyClass() );
}
}
Existem diferenças para invocar métodos que recebem parâmetros, métodos não públicos e métodos sobrecarregados.
O que ele quis dizer é que apartir de um parâmetro ( provavelmente uma string ) ele consiga identificar e executar um método.
Teste.javapublic class Teste { public static void main(String args[]){ for(String textoAExecutar: args){ executaMetodo(textoAExecutar); } } private void executaMetodo(String aExecutar){ // Faz algo que não sei como para encontrar e executar o metodo } private void metodoAChamar(){ // Faz o que tiver que fazer } }java Teste metodoAExecutar metodoQueNaoTemSem um monte de ifs, que eu me lembre não, mas deve haver alguém que saiba fazer algo parecido.
Até!
Exatamente o maquiavelbona entendeu…
Se alguém souber será ótimo.
Talvez por Anotação ou Reflexão.
public class MyClass { public static void myStaticMethod() {} public void myMethod() {} } public class Test { public static void main( String[] bananinha ) throws Exception { Method staticMethod = MyClass.class.getMethod( "myStaticMethod" ); staticMethod.invoke(); Method method = MyClass.class.getMethod( "myMethod" ); method.invoke( new MyClass() ); } }Existem diferenças para invocar métodos que recebem parâmetros, métodos não públicos e métodos sobrecarregados.
Excelente, muito obrigado.
Se por exemplo um desses métodos estáticos recebecem;
um parametro do tipo byte
e um outro dois parametros do tipo byte (ou um byte[])
? Muda muita coisa ou somente o .invoke
no caso (static)
(byte)
ou
no outro caso
(instancia, parametro(s))
é isso?
Desde já muito obrigado.
Em java há a possibilidade de executar um método pelo nome.exemplo:
final
String nome = “metodoAntes”;public stati void metodoAntes(){…}
consigo executar ?
Como ?
O que você quer fazer é tornar seu código mais dinâmico de modo
que possa ser alterado em tempo de execução, certo?
Eu sei que dá pra fazer isso em php.
Tentei pesquisar uma forma de executar seu comando (Colocado em uma String)
como em JavaScript através de um eval ou como no Oracle com um
EXECUTE_IMEDIATE. Até agora não encontrei nada animador nesse
sentido.
Qualquer coisa dê uma olhada no link abaixo:
http://schwern.org/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.html#no%20eval
Procure por No eval.
Executar um método pelo nome, usando reflection, é pouco eficiente e é melhor resolvido fazendo a classe implementar uma interface. Além disso, é muito aberto a erros que não podem ser resolvidos em tempo de compilação.
class A {
public void imprimir() {...}
public int calcular() {...}
}
class B {
public void imprimir() {...}
public double gravar() {...}
}
class C {
public void imprimir() {...}
public String converter() {...}
}
class Teste {
public static void executarMetodo (Object obj, String nomeMetodo) throws Exception {
Method meth = obj.getClass().getMethod (nomeMetodo, new Class[]);
meth.invoke (obj, new Object[]);
}
public static void main (String[] args) throws Exception {
A a = new A();
B b = new B();
C c = new C();
executarMetodo (a, "imprimir");
executarMetodo (b, "imprimir");
executarMetodo (c, "imprimir");
}
}
interface Imprimivel {
void imprimir();
}
class A implements Imprimivel {
public void imprimir() {...}
public int calcular() {...}
}
class B implements Imprimivel {
public void imprimir() {...}
public double gravar() {...}
}
class C implements Imprimivel {
public void imprimir() {...}
public String converter() {...}
}
class Teste {
public static void main (String[] args) {
Imprimivel a = new A();
Imprimivel b = new B();
Imprimivel c = new C();
a.imprimir(); // muito mais fácil, e não lança exceptions malucas.
b.imprimir();
c.imprimir();
}
}
dreampeppers99,
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html
De fato, conforme o LIPE postou a maneira mais elegante de se fazer isso é usando reflection.
tipo assim:
Method metodo = this.getClass().getMethod( "nomeDoSeuMetodo" );
O segundo parametro é um var-args onde você passa as classes que fazem parte da assinatura do método.
Abraços, posso te ajudar, trabalho com reflection faz um bom tempo. Qualquer coisa PM. 
Muito obrigado a todos, com essas informações acho que já consigo resolver meu “problema”.
Caso contrário volto aqui.
Valeu mesmo.
dreampeppers99,
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.htmlDe fato, conforme o LIPE postou a maneira mais elegante de se fazer isso é usando reflection.
tipo assim:Method metodo = this.getClass().getMethod( "nomeDoSeuMetodo" );O segundo parametro é um var-args onde você passa as classes que fazem parte da assinatura do método.
Abraços, posso te ajudar, trabalho com reflection faz um bom tempo. Qualquer coisa PM.![]()
De fato se eu precisar (acho que vou) mando uma PM, muito obrigado!