[quote=utluiz]Bom dia, pb600.
Pelo que entendi você quer verificar se algum atributo de algum objeto foi modificado durante a execução de um programa Java.
Antes de mais nada, acho você não deve considerar a possibilidade de alterar o Object ou qualquer classe do Java. Seria uma complicação muito grande para um problema que provavelmente pode ser resolvido de forma muito mais simples.
Além disso, vejo duas estratégias principais para atingir seu objetivo:
- Alterando suas classes, por exemplo, você pode criar uma interface Inspecionavel e implementá-la em todas as classes que deseja verificar se mudaram. Aí você pode usar seu classloader para armazenar uma lista dos objetos inspecionáveis e recuperar o hash quando necessário. O hash pode ser gerado a partir de uma IDE como o eclipse ou delegado para um método que gere o hash por reflexão, mas a performance e a complexidade podem ser um problema.
- Sem alterar as classes, é possível gerar um hash dos atributos através de reflexão. A vantagem é que suas classes permanecem intactas, mas tem o problema citado anteriormente. Além disso, é preciso tomar cuidado para não verificar a própria classe que está verificando as outras.
Se entendi bem o problema, você não precisa se preocupar com todas as instâncias da JVM, por exemplo Strings, datas ou números. Quando você gera um hash para os seus objetos, você já está incluindo os hashes de seus atributos, portanto se qualquer String, data ou número de seus objetos mudar o hash do objeto também muda, logo basta monitorar os seus objetos.[/quote]
Bom dia, Obrigado pela resposta =D
Como estas tentando me ajudar, irei detalhar mais meu objetivo.
Estou fazendo a validação de um programa para que caso o programa não esteja sendo alterado, ele possa ter acesso ao programa principal. (Ou seja estou desenvolvendo um ‘launcher’ que irá ter acesso remotamente ao arquivo do programa real).
Eu poderia utilizar de encriptação para criar uma chave e retribuir a localização do arquivo real, porém seria muito fácil de descobrir a chave após deobfuscar o launcher, e fazer o processo reverso.
Então pensei em fazer o próprio "launcher" gerar a chave que dá acesso ao programa real, e essa chave seria gerada pela verificação dos códigos do programa, assim a chave só seria a certa caso o programa estivesse exatamente como eu o distribuí.
Porém se eu alterasse cada classe manualmente, nada me garante que a pessoa que está tentando interferir no meu código com outra classe principal afete a validação, pois a classe dele não está sendo monitorada.
Por isso eu precisaria ter acesso completo às instâncias carregadas no programa, pois mesmo que a pessoa tente criar uma alternativa classe principal para interferir na classe original, eu saberia.
O validador pode constar no resultado, portanto não faz mal que a classe que esteja validando verifique a si mesmo, pois assim garanto que o validador não foi alterado para excluir alguma classe
Outra coisa, performance não é um grande problema pois isso seria apenas uma validação em tempo de inicialização.
E o hash dos objetos seria gerado por uma nova implementação minha, pois normalmente o hash vem diferente a cada instância, sendo assim impossível de se obter a chave certa.
Sem contar que o hash não pode ser accessível por reflexão de jeito nenhum já que ele supostamente deve ser uma chave secreta