Chamar um metodo com perametros indefinidos

Olá Pessoal,

Estou com problemas para criar uma classe customizada para acabar com o Ctrl C e Ctrl V.

Esta é a classe que estou utilizando pelo sistema :

AsyncCallback<Void> async = new AsyncCallback<Void>() {
		@Override
		public void onFailure(Throwable caught) {
			//enviar mensagem avisando que tentará conectar
			if (retryOnce) {
				retryOnce = false;
				Timer t = new Timer() {
					public void run() {
						metodoDesconhecido(parametroDesconhecido, async);
					}
				};
				t.cancel();
				t.schedule(1000);
			} else {
				//recarregar aplicacao.
			}
		}

		@Override
		public void onSuccess(Void result) {
			retryOnce = true;
		}
	};

O problema aí é que o metodoDesconhecido nao tem parametros definidos.

Alguem indica alguma solucao para criar uma AsyncCallback customizada contornando este problema?

Muito Obrigado!

Você quer passar quantos parâmetros precisar e de qualquer tipo?

Pelo o que eu entendi, você poderia usar o método assim:

public void metodoDesconhecido(AsyncCallback async, Object... args){ }
Você consegue passar o ‘async’ assim? não é melhor usar o this? Assim:

public void onFailure(Throwable caught) { //enviar mensagem avisando que tentará conectar if (retryOnce) { retryOnce = false; AsyncCallback&lt;Void&gt; newAsync = this; Timer t = new Timer() { public void run() { metodoDesconhecido(newAsync, parametroDesconhecido); } }; t.cancel(); t.schedule(1000); } else { //recarregar aplicacao. } }

Ou o problema seria saber O QUE você deve receber para saber se ele é um ctrl+C ou ctrl+V?

Como o Rafael sugeriu, um array de object é o que você precisa. Lembre-se do public static void main e seu String[] args…

Entao se eu utilizar o method.invoke(async, arrayOfObjects) irá funcionar para os métodos abaixo?

metodo1(AsyncCallback async, Integer param1) ou
metodo2(AsyncCallback async, String param1,Integer param2,List param3)

???

Pq o metodoDesconhecido é desconhecido e sao mais de 250 casos. Nao compensa “refatorá”-los…

Bem, de qualquer forma não será possivel utilizar Reflections no meu caso, porque a aplicacao utiliza o framework GWT (Google Web Toolkit), que transforma tudo pra javascript. Ou seja? Nao eh possivel utilizar reflecction. Bem, tem um framework que promete suportar Reflection no GWT, mas isso gera dependencia, e futuros problemas na atualizacao de bibliotecas.

Obrigado Pessoal e valeu Rafa!!!

Você pode receber um Object… mesmo, ele vai funcionar para todos esses casos.

Ai, você pode fazer algo parecido com isso:

public void metodoDesconhecido(AsyncCallback async, Object... objs){
   if (objs == null || objs.length == 0)
      throw new IllegalStateException(&quot;Objects cannot be null or empty. Unable to process.&quot;);
   
   for (Object obj : objs) {
      if (obj instanceof Integer) {
         Integer value = (Integer) obj;
         // Trabalha com Integer...
      } else if (obj instanceof String) {
         String value = (String) obj;
         // Trabalha com String...
      } else if (obj instanceof List) {
         List&lt;?&gt; value = (List&lt;?&gt;) obj;
         // Trabalha com List&lt;?&gt;...
      }
   }
}

respondendo a pergunta

[quote]Entao se eu utilizar o method.invoke(async, arrayOfObjects) irá funcionar para os métodos abaixo?

metodo1(AsyncCallback async, Integer param1) ou
metodo2(AsyncCallback async, String param1,Integer param2,List param3)

??? [/quote]
Sim vai funcionar pois quando voce usa daquela forma com as reticencias ele aceita um numero indefinido de elementos daquele tipo.

[quote=Rafael Guerreiro]Você pode receber um Object… mesmo, ele vai funcionar para todos esses casos.

Ai, você pode fazer algo parecido com isso:

[code]
public void metodoDesconhecido(AsyncCallback async, Object… objs){
if (objs == null || objs.length == 0)
throw new IllegalStateException("Objects cannot be null or empty. Unable to process.");

for (Object obj : objs) {
if (obj instanceof Integer) {
Integer value = (Integer) obj;
// Trabalha com Integer…
} else if (obj instanceof String) {
String value = (String) obj;
// Trabalha com String…
} else if (obj instanceof List) {
List<?> value = (List<?>) obj;
// Trabalha com List<?>…
}
}
}
[/code][/quote]

Entao eu teria que modificar os 250 metodos que funcionam normalmente, certo?

Isso nao iria funcionar pra mim. Muita mudanca, para tentar deixar o codigo limpo…

Eu não entendi o que você disse quanto aos 250 métodos…

Pode me mostrar alguns deles? :lol: eu ainda não desisti!

-EDIT-

Como não dá para usar reflection? Você não precisa executar um dos 250 métodos baseado em um array de parametros?

Você pode fazer primeiro um array que vai conter os tipos de cada um deles, e depois você passa os 2 arrays, o primeiro com o tipo e o segundo com o valor dos mesmos.

[quote=Rafael Guerreiro]Eu não entendi o que você disse quanto aos 250 métodos…

Pode me mostrar alguns deles? :lol: eu ainda não desisti![/quote]

:shock:

Voce eh engraçado Rafa.

Nao vai adiantar colocar o metodo aqui. Vou tentar explicar melhor…

Pensa assim: Toda comunicacao com o servidor requer um metodo desse, e cada metodo eh diferente. Estamos tentando implementar uma forma de sempre que tiver alguma falha (perda de sessao por exemplo) iremos chamar o metodo novamente e se der errado, forcamos o recarregamento da pagina. O codigo para isso eh simples, mas eh copiar e colar pela aplicacao toda.

AsyncCallback&lt;Object&gt; async = new AsyncCallback&lt;Object&gt;() {

		@Override
		public void onFailure(Throwable caught) {
			RichClientEntryPoint.getInstance().flashAlert(constantsStrings.common_reconnecting() + "(EFLIB:4)");
			if (retryOnce) {
				retryOnce = false;
				Timer t = new Timer() {
					public void run() {
                                                //tenta chamar o metodo novamente, enviando esse async.
					}
				};
				t.cancel();
				t.schedule(1000);
			} else {
				//recarregar
			}
		}

		@Override
		public void onSuccess(Object result) {
			retryOnce = true;

			//Faz o que tem que fazer quando da certo.....
		}
	};

:wink:
Clariou?

Certo! Agora entendi o tal do ctrl+c e ctrl+v.

Todos esses métodos são da mesma classe?

Você viu isso aqui?

-EDIT-
Em Ruby dá para você executar um bloco de código dentro de um método. Você sabe se existe algo parecido com isso no java?
Em Ruby é a palavra reservada yield…

[quote=Rafael Guerreiro]Certo! Agora entendi o tal do ctrl+c e ctrl+v.

Todos esses métodos são da mesma classe?

Você viu isso aqui?

[quote=Rafael Guerreiro]
-EDIT-

Como não dá para usar reflection? Você não precisa executar um dos 250 métodos baseado em um array de parametros?

Você pode fazer primeiro um array que vai conter os tipos de cada um deles, e depois você passa os 2 arrays, o primeiro com o tipo e o segundo com o valor dos mesmos.
[/quote][/quote]

Eles estao na mesma classe, mas sao chamados de diferentes.

Eu vi, entao eu acho que funcionaria… Isso se nao tivesse o GWT no meio.

Isso me lembra as solucoes mirabolantes do CVNO Utils, nao?

Abraco e valeu novamente!

É. Está ficando muito mirabolante…
Paciência… :frowning:

Utilizar o Command Pattern não te ajudaria?