2012-02-19 13 views
6

Soy un novato en Javassist, y ya he leído algunos tutoriales relacionados con él.¿Podemos agregar un campo no primitivo a una clase existente usando javassist?

Porque necesito hacer una inyección de código de bytes en cada método para ingresar o antes de la salida del método, y obtener algunas estadísticas de esto.

el tutorial javassit en línea, considero que podemos hacer un nuevo campo a una clase existente:

CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(CtClass.intType, "z", point); 
point.addField(f); 

embargo, el tipo de la CtField sólo contiene tipo primitivo por defecto, podemos añadir un nuevo campo cuyo tipo no es primitivo, por ejemplo, ArrayList?

Si puedo agregar el nuevo campo ArrayList a la clase existente, dado que la clase no importa java.util.ArrayList, ¿provocará un error de compilación?

Respuesta

6

Sí, puede agregar campos no primitivos. Solo necesita obtener un control de la clase para el campo, normalmente a través de ClassPool. Tenga en cuenta que necesitará el nombre completo de la clase que desea utilizar:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList"); 
CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(arrListClazz, "someList", point); 
point.addField(f); 
+0

Gracias, el código anterior significa que añadimos el nuevo algunalista miembro de ArrayList a la clase de punto, pero en la clase punto nos webs' t importar java.util.ArrayList, ¿esto causará el error de compilación? – LifeOnCodes

+0

Bueno, agregas el *** bytecode *** que representa un campo java.util.ArrayList, no una cadena de idioma real en inglés. Las instrucciones de importación son solo directivas de compilación que no aparecen en el archivo de clase compilado. Que es, por cierto, por qué necesita utilizar un nombre completo (FQN) al buscar clases en el ClassPool. – Perception

+0

Muchas gracias, ya veo. Creo que debería pasar algún tiempo estudiando el bytecode. Una pregunta más, espero que pueda ayudarme, ¿es posible que el memejor de someList sea de tipo genérico, como ArrayList someList? – LifeOnCodes

Cuestiones relacionadas