Eu vi a parte proxy do hibernado nos últimos dois dias. A primeira reação foi que a camada subjacente usou reflexão e gerou uma classe de proxy para a entidade do usuário. Mais tarde, percebi que a reflexão não tinha capacidade de gerar novas classes, então naturalmente encontrei o Javassist (endereço de download).
A maioria dos tutoriais pesquisados on -line é explicada à API Javassist, mas no final, geralmente não há processo de carregamento. Quando o autor imita esses tutoriais para o carregamento da classe, os resultados carregados são a classe original e nenhum conteúdo com o bytecode modificado.
Após alguma exploração, o autor descobriu que a última etapa da maioria dos tutoriais na Internet, Saving Bytecode é usada para salvar o bytecode. Depois de verificar sua estrutura de funções, descobriu que ele também possui uma sobrecarga do tipo string. Porque no eclipse, a posição raiz do bytecode não é ".//" mas ".//bin", e outra sobrecarga de writefile provavelmente será o parâmetro que especifica a posição raiz do bytecode. Depois de algumas mudanças, descobri que era verdade.
A seguir, o código de demonstração:
Esta é a estrutura do projeto do autor:
Editable.java: package com.thrblock.javassist; classe pública editável {public void showInfo () {System.out.println ("Infodefault!"); }} Main.java: pacote com.thrblock.javassist; importar java.io.ioException; importar javassist.cannotCompileException; importar javassist.classpool; import javassist.ctclass; importa javassist.ctmethod; importen ma ma maineStist; importa javassist.ctmethod; importn ma maiores.ctNewmEcls; importantes; main (string [] args) {classPool pool = classPool.getDefault (); try {pool.insertclassPath (".// bin"); // Defina o caminho raiz. (O caminho raiz definido aqui obviamente não é usado pelo writefile) ctclass cc = pool.makeclass ("com.thrblock.javassist.editablechangeed"); // simular o modo proxy de hibernate/set.thblock, criamos uma nova classe cc.SetSuperclass (pool.get; CtNewMethod.Make ("public void showinfo () {super.showinfo (); system.out.println (/" CustomInSerthaha!/");}", Cc); // Adicione um método, observe que substitui os métodos na classe pai. cc.addmethod (cm); cc.WriteFile (".// bin"); // Isso é mais importante. O resultado do parâmetro nulo é que ele não é salvo no caminho da raiz do eclipse bytecode. } Catch (NotfoundException | não é possível compensar | ioexception e) {e.printStackTrace ();} tente {class <?> cl = class.ForName ("com.thrblock.javassist.editablechangeed"); // carregar nossa nova classe editável = (editável) cl.NewinSTANCE (); Hibernado. ed.showinfo (); // chamando o método. } Catch (ClassNotFoundException | InstantionException | IllegalAccessException e) {E.PrintStackTrace ();}}}Resultado de impressão:
InfodeFault!
CustomInserthaha!
Outras notas:
Como geramos uma classe, se o nome da classe for o mesmo que o nome da classe original, o arquivo da classe será substituído. No entanto, se a classe tiver sido carregada pela JVM antes da modificação, a peça modificada não entrará em vigor e a JVM deve ser reiniciada.
Resumir
O exposto acima é todo o conteúdo deste artigo sobre o método de uso correto de Javassist sob Eclipse. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!