gpt4 book ai didi

java - 如何使用 Javassist 制作 ArrayList

转载 作者:IT老高 更新时间:2023-10-28 21:02:33 28 4
gpt4 key购买 nike

我想在检测期间将 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());
}

从打印语句接收到的输出是,

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

添加的行(我删除了一些打印行), 插入之前

 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);

插入之后

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

最佳答案

VerifyError 在 VM 注意到已编译的字节码无效时发生。例如,当您尝试使用整数或类似内容的加载指令读取长变量时。

因此,在您的情况下,代码编译,javaassist 发挥其魔力,但 VM 不接受代码。它必须是 javassist 中的错误或使用中的错误。

如何解决:

1) 据我所知,您只能在使用 insertBefore 的方法的开头添加一条语句(而不是一行)。如果要添加多个,请将它们包裹在大括号 {} 中,例如 method.insertBefore("{"+ bBuilder.toString() + "}") ;

2) 您没有像使用 startTime

那样将元数据添加为变量

X) 如果此错误或其他错误仍然存​​在,请尝试将类文件写入磁盘上的文件(使用 toClassFile 您可以将修改后的类文件作为 byte[])。然后就可以使用javap之类的工具来查看编译后的代码,更清楚的看到是怎么回事。

关于java - 如何使用 Javassist 制作 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299987/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com