[Resolvido] Chamar método de um Field

7 respostas
P

Olá, meu problema é o seguinte:
O seguinte código é apenas ilustrativo.

public class Client {

public Stream stream = new Stream();

}

public class Stream(){

public void writeInt(int intValue){
...
}

}

Ok, vou tentar explicar meu problema, estou carregando de um jar a classe Client, nessa classe Client contém o Field Stream(Por exemplo), e eu quero chamar o método writeInt, usando a instância que está na classe Client, mas quando vou invocar o método eu não sei de onde pego a instância da classe Stream(Não posso simplesmente criar outra instância) ^^
O programa acha O Field stream, pega a classe e consegue achar o método writeInt, mas na hora de invocar não tenho a instância do stream.
O melhor que consigo é esse erro:

object is not an instance of declaring class

Parte do meu Código:

Procura O Field Stream:

Field field = getClient().getDeclaredField("stream"); Class<?> streamClass; if (field instanceof Field) { streamClass = field.getType(); callStreamMethod(field, "writeWord", new Object[] {21000}); }
Invoca o método “writeWord”

public void callStreamMethod(Field field, String methodName, Object[] arguments) { try { Method method = null; for (Method m : field.getType().getMethods()) { if (m.getName().equals(methodName)) { System.out.println("Calling Method: " + m.getName()); method = m; } } if (method instanceof Method) { method.setAccessible(true); field.setAccessible(true); method.invoke(field, arguments); } else { System.err.println("Method Not Found!"); } } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }

Alguém consegue me dizer um meio de chamar o método writeWord?
Obrigado :smiley:

7 Respostas

mauricioadl

no metodo invoke vc tem que passar o objeto que contem o metodo.

tipo assim:

Class c = Class.forname("minhaclasse"); Method m = c.getMethod("meumetodo"); Object o = c.newInstance(); // passa o objeto m.invoke(o);

P

Mas assim ele cria uma nova instância não cria? Eu não posso criar uma nova instância, imagina que eu tenho um socket, se eu criar uma nova instância de um socket eu teria que reconectar :stuck_out_tongue:

mauricioadl

bom, se vc ja tem a instancia apenas passa ela no metodo invoke.

P

Sim mas o problema é pegar a instancia do Field :stuck_out_tongue:

mauricioadl

bom, vc sabe que o Field eh um atributo de uma classe. vc pode pegar o objeto dele atravas do seu metodo get dando o invoke na classe dele. depois vc da um invoke nele.

P

Ah Agora entendi! Eu dou um get informando a instancia da classe Client ;D Consegui cara! Muito Obrigado pela atenção :stuck_out_tongue:

mauricioadl

legal!

poe um resolvido ae pra galera!

um grande abraço.

Criado 23 de janeiro de 2012
Ultima resposta 23 de jan. de 2012
Respostas 7
Participantes 2