metodos example java arraylist instrumentation

example - Cómo hacer un ArrayList usando Javassist



arraylist java example (1)

Un VerifyError ocurre cuando la VM advierte que un bytecode ya compilado no es válido. Por ejemplo, cuando intenta leer una variable larga utilizando una instrucción de carga para un entero, o cosas similares.

Entonces, en su caso, el código se compila, javaassist hace su magia, pero la máquina virtual no acepta el código. Debe ser un error en javassist o un error en su uso.

Como arreglarlo:

1) Por lo que sé, solo puede agregar una declaración (no una línea) al comienzo de un método usando insertBefore . Si desea agregar más de uno, envuélvalos entre llaves {} , algo como method.insertBefore("{" + bBuilder.toString() + "}" );

2) No has agregado los metadatos como una variable como hiciste con startTime

X) Si este u otro error aún persiste, intente escribir el archivo de clase en un archivo en el disco (utilizando toClassFile puede acceder al archivo de clase modificado como un byte[] ). Luego, puede usar herramientas como javap para ver el código compilado y ver más claramente lo que está sucediendo.

Quiero agregar un arrayList en un método durante la instrumentación. Lo intenté como se menciona en ( Javassist CannotCompileException al intentar agregar una línea para crear un mapa ) pero produce una excepción diferente con java.lang.VerifyError.

public void createInsertBefore(String scenarioName, String className, CtMethod method, String insertBefore) throws CannotCompileException { method.addLocalVariable("startTime", CtClass.longType); StringBuilder bBuilder = new StringBuilder(); bBuilder.append("startTime = System.nanoTime();"); bBuilder.append("System.out.println(startTime);"); if((insertBefore!=null) && !insertBefore.isEmpty()){ bBuilder.append(insertBefore); } bBuilder.append("java.util.List metadata = new java.util.ArrayList();"); System.out.println(bBuilder.toString()); method.insertBefore(bBuilder.toString()); }

La salida recibida de la declaración de impresión es,

startTime = System.nanoTime(); System.out.println(startTime); java.util.List metadata = new java.util.ArrayList();

Pero lanza siguiente excepción,

Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382) at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397) Caused by: java.lang.VerifyError at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144) at org.wso2.das.javaagent.instrumentation.Agent.premain(Agent.java:57) ... 6 more FATAL ERROR in native method: processing of -javaagent failed Aborted (core dumped)

La situación es la misma que antes, pero ¿por qué lanza una excepción diferente? ¿Qué estoy haciendo mal ... algo de ayuda por favor ...

Actualización 1

líneas agregadas con (he eliminado algunas líneas de impresión), insertBefore ,

startTime = System.nanoTime(); java.util.List metadata = new java.util.ArrayList();

Insertar

System.out.println("prepareStatement is running"); java.util.Map/*<String,String>*/ arbitraryMap = new java.util.HashMap/*String,String>*/(); arbitraryMap.put("query",$1);System.out.println(arbitraryMap);

insertar después de

System.out.println(System.nanoTime()-startTime);