gpt4 book ai didi

java - 如何用 ASM 重命名一个类并保持在同一个类加载器中?

转载 作者:行者123 更新时间:2023-11-30 11:35:52 30 4
gpt4 key购买 nike

我正在尝试使用 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

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

最佳答案

在 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(), ... )

关于java - 如何用 ASM 重命名一个类并保持在同一个类加载器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857432/

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