uda*_*ani 19 java instrumentation arraylist
我想在检测期间将arrayList添加到方法中.我在尝试添加一行来创建Map时尝试了(Javassist CannotCompileException),但它抛出了一个与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());
}
Run Code Online (Sandbox Code Playgroud)
从print语句收到的输出是,
startTime = System.nanoTime();
System.out.println(startTime);
java.util.List metadata = new java.util.ArrayList();
Run Code Online (Sandbox Code Playgroud)
但它抛出以下异常,
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)
Run Code Online (Sandbox Code Playgroud)
情况与之前相同,但为什么会抛出不同的异常.我做错了什么......有些帮助请...
更新1
添加的行(我删除了一些打印行), insertBefore,
startTime = System.nanoTime();
java.util.List metadata = new java.util.ArrayList();
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
insertAfter
System.out.println(System.nanoTime()-startTime);
Run Code Online (Sandbox Code Playgroud)
VerifyError当VM注意到已编译的字节码无效时,会发生A. 例如,当您尝试使用加载指令读取整数或类似事物的长变量时.
因此,在您的情况下,代码编译,javaassist尽其所能,但VM不接受代码.它必须是javassist中的错误或其使用中的错误.
如何解决:
1)据我所知,你只能在方法的开头添加一个语句(不是一行)insertBefore.如果你想添加多个,请将它们包裹在大括号中{},例如method.insertBefore("{" + bBuilder.toString() + "}";
2)您没有像使用过那样将元数据添加为变量 startTime
X)如果此错误或其他错误仍然存在,请尝试将类文件写入磁盘上的文件(使用toClassFile您可以将修改后的类文件作为a byte[]).然后你可以使用像javap这样的工具来查看已编译的代码,并更清楚地看到发生了什么.