Vi la parte proxy de Hibernate en los últimos dos días. La primera reacción fue que la capa subyacente utilizaba la reflexión y generaba una clase proxy para la entidad del usuario. Más tarde, me di cuenta de que la reflexión no tenía ninguna capacidad para generar nuevas clases, por lo que naturalmente encontré Javassist (dirección de descarga).
La mayoría de los tutoriales buscados en línea se explican a la API de Javassist, pero al final, a menudo no hay un proceso de carga. Cuando el autor imita estos tutoriales para la carga de clase, los resultados cargados son la clase original y no hay contenido con el Bytecode modificado.
Después de algunas exploraciones, el autor descubrió que el último paso en la mayoría de los tutoriales en Internet, guardando bytecode se usa para guardar el código bytecode. Después de verificar su estructura de función, descubrió que también tiene una sobrecarga de tipo de cadena. Porque en eclipse, la posición raíz del bytecode no es ".//" pero ".//bin", y es probable que otra sobrecarga de File Write sea el parámetro que especifique la posición raíz del bytecode. Después de algunos cambios, descubrí que era cierto.
El siguiente es el código de demostración:
Esta es la estructura del proyecto del autor:
Editable.java: paquete com.thblock.javassist; public class Editable {public void showInfo () {System.out.println ("InfodeFault!"); }} Main.java: paquete com.thblock.javassist; import java.io.ioException; import javassist.cannotcompileException; import javassist.classpool; import javassist.ctclass; import javassist.ctmethod; import javassist.ctnewmethod; import javassist.notfoundexception; pública clase pública principal args) {classpool Pool = classpool.getDefault (); try {prow.insertClassPath (".// bin"); // Establezca la ruta raíz. (La ruta raíz establecida aquí obviamente no es utilizada por WriteFile) CTClass CC = Pool.makeclass ("com.thlblock.javassist.editableChanged"); // Simular el modo proxy de hibernado, creamos una nueva clase CC.SetsuperClass (piscina.get ("com.thblock.Javassist.editable"); Ctnewmethod.make ("public void showInfo () {super.showinfo (); system.out.println (/" custominserthaha!/");}", Cc); // Agregar un método, tenga en cuenta que anula los métodos en la clase principal. cc.addmethod (cm); cc.writeFile (".// bin"); // Esto es más importante. El resultado del parámetro NULL es que no se guarda en la ruta de la raíz del código de byto de eclipse. } catch (noTFoundException | CannCompileException | ioException e) {E.PrintStackTrace ();} try {class <?> cl = class.forname ("com.thblock.javassist.editableChanged"); // Cargue nuestra nueva clase editable = (editable) cl.newinstance (); // porque es inheritance es el mismo de la carga de la misma clase. Hibernado. ed.showinfo (); // llamando al método. } Catch (ClassNotFoundException | InstanciationException | ilegalAccessException e) {E.PrintStackTraceResultado de impresión:
Infodefault!
CustomSerthaha.
Otras notas:
Dado que hemos generado una clase, si el nombre de la clase es el mismo que el nombre de clase original, el archivo de clase se sobrescribirá. Sin embargo, si la clase ha sido cargada por el JVM antes de la modificación, la parte modificada no entrará en vigencia y el JVM debe reiniciarse.
Resumir
Lo anterior es todo el contenido de este artículo sobre el método de uso correcto de Javassist en Eclipse. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!