Olá galera! bom, de repente eu esteja tentando fazer da maneira mas difícil ou complexa. Bom, vou deixar essa questão para mais tarde só que agora quero mostrar a vocês um outro problema que estou tendo. :roll:
Primeiramente eu to criando um objeto que e constantemente monitorado pelo sistema e caso seja executado qualquer método setter desse objeto, ele deve receber uma modificação de estado. O estado desse objeto e mapeado em uma classe Enum e por default o estado e clear mas caso ocorra um setter ele deve receber um dirty nesse estado.
Bem, eu construí um código de demonstração para expressa esse problema. Peguem e executem. Debuguem no para perceber qual o problema. 8)
Mas de ante-mão irei dizer. O método main retorna um objeto monitoravel utilizando o metodo Proxy_Test.create e altera o método setnome desse objeto de modo que o Proxy, através do metodo invoke, capture essa alteração. Daí ele realiza um teste simples para saber se o método executado e ou não um setter (essa e uma forma de verificação bem simples). Caso seja, o proxy deve altera o estado o objeto que esta sendo monitorado, entretanto, quando chega em setStateMethod.invoke(proxy, parameters) que e justamente a linha que executa a alteração do estado, essa alteração não ocorre o laço retorna para o if e o processo começa todo novamente. :oops:
Minha pergunta e bem simples. Onde ta meu erro? O que to fazendo que ta saindo errado? Ou melhor, quem consegue corrigir isso ai? 
Como visto, o código abaixo ta completo ou pelo menos eu espero que esteja (qualquer coisa posso passá-lo novamente) e pode ser executado direto debugando pelo main e indo pelo invoke que e o cara que não deixa passar. Olhem abaixo…
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Proxy_Test implements InvocationHandler, Serializable{
protected Class dominioClass;
protected Proxy_Test(Class dominioClass){
this.dominioClass = dominioClass;
}
public static Object create(Class dominioClass){
return Proxy.newProxyInstance(dominioClass.getClassLoader(), new Class[] { dominioClass }, new Proxy_Test(dominioClass));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable, Exception {
String methodName = method.getName();
// verifica se e um metodo set e caso seja entao muda
// o estado do objeto proxy
if(methodName.startsWith("set")) {
Class[] paramTypes = { EnumState.class };
Object[] parameters = { EnumState.osDirty };
// pega o metodo setsState do objeto proxy
Method setStateMethod = proxy.getClass().getMethod("setState", paramTypes);
// executa o metodo setState passando o parametro desejado
setStateMethod.invoke(proxy, parameters);
/*
* nesse ponto e executado o getState para verificar se ele realmente foi modificado para EnumState.osDirty
Method getStateMethod = proxy.getClass().getMethod("getState");
System.out.println(getStateMethod.invoke(proxy));
*/
}
return null;
}
public static void main(String args[]) {
Usuario b = (Usuario) Proxy_Test.create(Usuario.class);
b.setNome("bobo da corte");
System.out.println(b.getNome());
System.out.println(b.getState());
}
public enum EnumState{
osClear, osDelete, osDirty;
}
public interface Dominio{
public void setState(EnumState arg0);
public EnumState getState();
}
public interface Usuario implements Dominio {
public void setNome(String nome);
public String getNome();
}
}
Pessoal, espero que alguém ai me ajude pos realmente to precisando disso imensamente. Qualquer duvida me perguntem que terei maior prazer em responder. :lol:
Att,