我想在插桩期间将一个arrayList添加到方法中。我按照(Javassist CannotCompileException when trying to add a line to create a Map)中所述的方式尝试实现,但出现了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());
}
print语句输出的结果是:
startTime = System.nanoTime();
System.out.println(startTime);
java.util.List metadata = new java.util.ArrayList();
但是它会抛出以下异常:
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)
情况和之前一样,但为什么会抛出不同的异常。我做错了什么...求帮助...
更新1
添加了一些行(我已删除一些打印行),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);
sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
,也就是说出了问题的是本地代码。你所得到的错误的 JavaDoc 说:当“验证程序”检测到一个类文件虽然格式正确,但包含某种内部不一致或安全问题时抛出异常。
- 这可能取决于正在增强的类,也许你正在尝试两次插入或者已经有一个名为startTime
,metadata
等的变量。 - ThomasstartTime
创建一个本地变量,但是将metadata
添加为字符串命令?我对 Javassist 不是很了解,所以这可能是唯一的方法 - 这只是一个猜测,因为如果其中一个有效而另一个无效,则必定存在引入不兼容性的差异。 - Thomas