Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

452
Vistas
Instrumentación de Java: evitar que la referencia de clase cargue la clase

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!

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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:

  • proporcione ambos métodos, editClass(Class<?> clazz) y editClass(String qualifiedName)
  • escriba el método 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 literales
  • realizar una transformación de código estático de las clases de agente, reemplazando todas las llamadas de editClass(Class<?>) con editClass(String)
    Esto no debería ser demasiado difícil, ya que solo tiene que reemplazar todas las secuencias de ldc packagename/Foo.class , invokestatic (Ljava/lang/Class;)V con ldc "packagename.Foo" , invokestatic (Ljava/lang/String;)V .
    Puede ser incluso más fácil cuando el método editClass(String qualifiedName) puede manejar los nombres de clases internas (usando barras en lugar de puntos).
    Dado que dijo que "recientemente descubrió la instrumentación de Java", este podría ser un buen ejercicio en las transformaciones de archivos de clase
  • Use las clases de agente transformadas que ya no tienen referencias a las clases para transformar, para realizar las transformaciones de tiempo de carga
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda