2

我正在尝试使用ASM 4.0重命名一个类:

ClassReader reader = new ClassReader(
    loader.getResourceAsStream("test/MyClass.class")
);
ClassWriter writer = new ClassWriter(reader, 0);
ClassVisitor visitor = new RemappingClassAdapter(visitor, new Remapper() { /* skipped */ });
reader.accept(visitor, 0);
return new ClassLoader() {
    public Class<?> load(final String name, final byte[] bytes) {
        return this.defineClass(name, bytes, 0, bytes.length);
    }
}.load("test/MyClass", writer.toByteArray());

我故意跳过了重命名部分。新类应该是原始类的精确副本。是的,但它不能再像旧的一样使用了:

java.lang.ClassCastException: test.MyClass cannot be cast to test.MyClass

如何留在同一个类加载器中?

4

1 回答 1

1

在 JVM 中,每个类都由它的完全限定名称和加载该类的类加载器来标识。这解释了您的 ClassCastException。

重命名类后,您应该能够在任何类加载器中加载重命名的类。使用反射来获取“ClassLoader.defineClass()”方法并使用它在 getClass().getClassLoader() 上调用它;

Method m=ClassLoader.class.getDeclaredMethod("defineClass",
 String.class,byte[].class,int.class,int.class) 
m.setAccessible(true);
m.invoke(getClass().getClassLoader(), ... )
于 2013-02-14T10:03:33.330 回答