Hola comunidad de StackOverflow,
Recientemente descubrí la instrumentación de Java y las grandes cosas que puedes hacer con ella, así que decidí escribir una pequeña biblioteca para mí que simplifica algunas de estas cosas.
Tengo el siguiente método (simplificado):
public static void editClass(Class<*> clazz) { ... } Agrega un transformador a través de Instrumentación que transforma el código de bytes de las clases cargadas con el nombre de clazz.getName() .
Así que en mi método premain, puedo decir
editClass(Foo.class);Mi problema es que, al especificar la clase a través de una referencia a ella (.class), esta clase se carga antes de que se agregue el transformador, por lo que después de eso, tengo que volver a transformar la clase, lo que me impide agregar/eliminar métodos, etc.
Entonces, ¿hay alguna manera de no cargar la clase cuando se usa esta referencia de clase? ¿O alguna otra forma de implementar esto? Sé que podría simplemente pasar el nombre de la clase como un argumento, pero realmente me gustaría hacer que toda esta biblioteca sea segura para los tipos y facilitar la refactorización.
¡Gracias por adelantado!
Si desea llamar al método editClass solo desde premain y asumimos que el Agente Java en sí mismo no usa la clase de lo contrario, de modo que el literal de clase dentro de la llamada editClass sería el único activador, puede hacer lo siguiente:
editClass(Class<?> clazz) y editClass(String qualifiedName)premain (o las clases de agente en general) usando editClass(Class<?>) y disfrute de la seguridad en tiempo de compilación con respecto a la existencia de las clases a las que se hace referencia a través de literaleseditClass(Class<?>) con editClass(String)ldc packagename/Foo.class , invokestatic (Ljava/lang/Class;)V con ldc "packagename.Foo" , invokestatic (Ljava/lang/String;)V .editClass(String qualifiedName) puede manejar los nombres de clases internas (usando barras en lugar de puntos).