Java 得到;“不支持操作异常”;当尝试重新传输表单类时
JDK1.6,动态修改jvm中加载的类。当我注释代码时:Java 得到;“不支持操作异常”;当尝试重新传输表单类时,java,jvm,aop,cglib,jvmti,Java,Jvm,Aop,Cglib,Jvmti,JDK1.6,动态修改jvm中加载的类。当我注释代码时:classReader.accept(classAdapter,classReader.SKIP\u DEBUG),异常“UnsupportedOperationException”解除。 实际上,为了测试我的代码,我没有修改任何字段或方法。但是,在调用retransformClasses()之后,程序捕获异常“UnsupportedOperationException”。有人有类似的例外吗?有人能给我一些建议吗?谢谢 代码如下: publ
classReader.accept(classAdapter,classReader.SKIP\u DEBUG)代码>,异常“UnsupportedOperationException”
解除。
实际上,为了测试我的代码,我没有修改任何字段或方法。但是,在调用retransformClasses()
之后,程序捕获异常“UnsupportedOperationException”
。有人有类似的例外吗?有人能给我一些建议吗?谢谢
代码如下:
public byte[] modifySleepMethod() throws Exception {
System.out.println("Call modifySleepMethod");
ClassReader classReader = new ClassReader(classfileBuffer);
System.out.println("new classreader");
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
System.out.println("new classwriter");
ClassAdapter classAdapter = new ModifyMethodClassAdapter(classWriter);
classReader.accept(classAdapter, ClassReader.SKIP_DEBUG);
byte[] classFile = null;
classFile = classWriter.toByteArray();
FileOutputStream fos;
try {
fos = new FileOutputStream("D:\\testfos\\b\\Example2.class");
System.out.println("ddddddmodifymethodtest");
fos.write(classFile);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return classFile;
}
}
|
protectedvoid转换(类clazz,类加载器){
DemoTransformer dt=新的DemoTransformer(clazz.getName(),classLoader);
仪表。添加变压器(dt,真值);
试一试{
仪器仪表.重传类(clazz);
}捕获(例外情况除外){
抛出新的RuntimeException(“未能转换[”+clazz.getName()+“]”,ex);
}
是否检查了isRetransformClassesSupported()
返回的内容?是的,isRetransformClassesSupported()
,isRetransformClassesSupported()
,以及isModifiableClass(clazz)
all return true。我的ASM代码有什么问题吗?我想在方法中添加一行。应该允许这样做。有人能给我一些建议吗?@Eugene KuleshovWell,我是Java的新手,当然是JVM,ASM。我犯了一个愚蠢的错误,在我的ASM代码中向目标类添加了一个不支持重新传输的字段在OracleJDK1.6中。所以有一个“UnsupportedOperationException”的异常。实际上是。我添加了一个字段,这是不允许的。
protected void transform(Class<?> clazz, ClassLoader classLoader) {
DemoTransformer dt = new DemoTransformer(clazz.getName(), classLoader);
instrumentation.addTransformer(dt, true);
try {
instrumentation.retransformClasses(clazz);
} catch (Exception ex) {
throw new RuntimeException("Failed to transform [" + clazz.getName() + "]", ex);
}