Получил «UnsupportedOperationException» при попытке повторно преобразовать классы
JDK1.6, динамически изменяйте класс, загруженный в jvm. Когда я комментирую код:classReader.accept(classAdapter, ClassReader.SKIP_DEBUG);
, исключение"UnsupportedOperationException"
disapear. На самом деле, для тестирования своего кода я не модифицировал ни одно поле или метод. Но программа ловит исключение"UnsupportedOperationException"
после звонкаretransformClasses()
, У кого-нибудь есть подобное исключение? Кто-нибудь может дать мне несколько советов? THX коды следующие: |
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;
}
}
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);
}