English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hace unos días, vi la parte de proxy de Hibernate y mi primera reacción fue que utilizaba reflexión en la capa inferior para generar clases proxy para las entidades de usuario. Más tarde me di cuenta de que la reflexión no tiene la capacidad de generar nuevas clases, por lo que naturalmente encontré Javassist (dirección de descarga).
La mayoría de los tutoriales que se encuentran en línea son explicaciones del API de Javassist, pero al final, a menudo no hay un proceso de carga. Cuando imité estos tutoriales para cargar clases, los resultados eran las clases originales, sin generar contenido de bytecode modificado.
Después de una serie de exploraciones, descubrí que la mayoría de los tutoriales en línea utilizan la sobrecarga sin parámetros de writeFile para guardar bytecode en el último paso. Al ver la estructura de la función, descubrí que también hay una sobrecarga de tipo String. Dado que en Eclipse, la ubicación raíz donde se almacena bytecode no es '.\\' sino '.\\bin', es probable que otra sobrecarga de writeFile sea el parámetro que especifica la ubicación raíz del bytecode. Después de algunos cambios, resultó ser cierto.
A continuación, se compartirá el código:
Este es el esquema de mi proyecto:
Editable.java: package com.thrblock.javassist; public class Editable {}} public void showInfo(){ System.out.println("InfoDefault!"); } }
Main.java: package com.thrblock.javassist; import java.io.IOException; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.CtNewMethod; import javassist.NotFoundException; public class Main { public static void main(String[] args) { ClassPool pool = ClassPool.getDefault(); try{}} pool.insertClassPath(".\\bin"); //Establecer la ruta raíz. (La ruta raíz establecida aquí no se utiliza por writeFile) CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged"); //Simular el patrón de proxy de Hibernate, creamos una nueva clase cc.setSuperclass(pool.get("com.thrblock.javassist.Editable")); //Establecer su clase padre CtMethod cm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println("CustomInsertHAHA!");}",cc); //Añadir un método, preste atención a que sobrescribe el método de la clase padre. cc.addMethod(cm); cc.writeFile(".\\bin"); //Aquí es muy importante, el resultado sin parámetros no se guarda en la ruta raíz del bytecode de eclipse. } catch (NotFoundException | CannotCompileException | IOException e) { e.printStackTrace(); } try{}} Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged"); //Cargar nuestra nueva clase Editableed = (Editable) cl.newInstance(); //Debido a que hereda de la clase Editable, aquí es igual que el principio de load en Hibernate. ed.showInfo(); //Llamar al método. } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } }
Resultado de la impresión:
InfoDefault!
CustomInsertHAHA!
Otras consideraciones:
Dado que hemos creado una clase, si el nombre de esta clase es el mismo que el nombre de la clase original, se sobrescribirá el archivo class, pero si la clase ha sido cargada por el JVM antes de la modificación, las partes modificadas no surtirán efecto y es necesario reiniciar el JVM.
Resumen
Esto es todo el contenido del análisis del código de uso correcto de Javassist bajo Eclipse, espero que sea útil para todos. Los amigos interesados pueden continuar consultando otros temas relacionados en este sitio web, y bienvenidos a dejar comentarios si hay algo que no esté bien. Gracias a todos por su apoyo a este sitio!
Declaración: El contenido de este artículo se ha obtenido de Internet, pertenece al propietario original, el contenido se ha contribuido y cargado por los usuarios de Internet, este sitio web no posee derechos de propiedad, no se ha realizado una edición humana y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w para informar y proporcionar evidencia relevante.3Avisos: El contenido de este artículo se obtiene de Internet, el copyright pertenece al propietario original, el contenido se carga por iniciativa de los usuarios de Internet, este sitio web no posee derechos de propiedad, no se ha realizado una edición humana y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w para informar y proporcionar evidencia relevante. Una vez confirmada la infracción, este sitio eliminará inmediatamente el contenido sospechoso.