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 に答える