Voglio aggiungere una lista di array in un metodo durante la strumentazione. Ho provato come menzionato in (Javassist CannotCompileException when trying to add a line to create a Map) ma genera un'eccezione diversa con un java.lang.VerifyError.Come creare un ArrayList usando Javassist
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());
}
uscita ricevuto dal comunicato stampa è,
startTime = System.nanoTime();
System.out.println(startTime);
java.util.List metadata = new java.util.ArrayList();
Ma getta seguente eccezione,
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 situazione è uguale a prima, ma perché lo fa un'eccezione diversa . Che cosa sto facendo di sbagliato .... di aiuto per favore ...
Aggiornamento 1
linee con (Ho rimosso alcune linee di stampa), insertBefore,
startTime = System.nanoTime();
java.util.List metadata = new java.util.ArrayList();
InsertAt
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);
InsertAfter
System.out.println(System.nanoTime()-startTime);
Sembra un errore nel codice nativo. – Thomas
Cosa intendi? U significa il resto del codice? Ho pensato che il problema fosse con questa affermazione, perché se commento questa linea, la strumentazione funziona bene. Quindi penso che sia qualcosa di sbagliato in questa affermazione. – udani
Il tuo codice potrebbe essere sbagliato ma l'errore si verifica qui: 'sun.instrument.InstrumentationImpl.retransformClasses0 (Metodo nativo)' cioè all'interno del codice nativo. Il JavaDoc sull'errore che si ottiene dice: "Gettato quando il" verificatore "rileva che un file di classe, benché ben formato, contiene una sorta di incoerenza interna o problema di sicurezza. - Potrebbe dipendere dalla classe che viene migliorata, forse stai cercando di inserire due volte o c'è già una variabile chiamata 'startTime',' metadata' ecc. – Thomas