我使用ASM更新的类栈地图,但是当ASM getMergedType
,会出现以下异常:问题与ASM getMergedType和getCommonSuperClass
了java.lang.RuntimeException:
产生java.io.IOException:资源没有找到IntefaceImplA。
如果没有asm修改类方法,它确实工作正常。
我已经定义了两个接口A和B:IntefaceImplA
和 IntefaceImplB
。
我的环境的源代码:
IntefaceA.java
public interface IntefaceA {
void inteface();
}
IntefaceImplA.java
public class IntefaceImplA implements IntefaceA {
@Override
public void inteface() {
}
}
IntefaceImplB.java
public class IntefaceImplB implements IntefaceA {
@Override
public void inteface() {
}
}
Test.java
public class Test {
public IntefaceA getImpl(boolean b) {
IntefaceA a = b ? new IntefaceImplA() : new IntefaceImplB();
return a;
}
}
Main.java
public class Main {
public static void main(String args[]) {
....
if (a instance of Test) {
..
...
}
}
}
我编一个亚军罐子后,并删除IntefaceImplA.class和IntefaceA从jar中手动.class。为什么我想删除这些类文件,因为春天总是喜欢做这个东西。
runner jar可以在没有ASM的情况下正常运行,但使用asm会发生异常。因为asm想要为IntefaceImplA和IntefaceImplB获取MergeType,但IntefaceImplA被我删除。 调查后,ASM ClassWriter源代码,我发现下面的代码:
protected String getCommonSuperClass(String type1, String type2)
{
ClassLoader classLoader = this.getClass().getClassLoader();
Class c;
Class d;
try {
c = Class.forName(type1.replace('/', '.'), false, classLoader);
d = Class.forName(type2.replace('/', '.'), false, classLoader);
} catch (Exception var7) {
throw new RuntimeException(var7.toString());
}
if(c.isAssignableFrom(d)) {
return type1;
} else if(d.isAssignableFrom(c)) {
return type2;
} else if(!c.isInterface() && !d.isInterface()) {
do {
c = c.getSuperclass();
} while(!c.isAssignableFrom(d));
return c.getName().replace('.', '/');
} else {
return "java/lang/Object";
}
}
其实,我删除了相关的类文件,类加载器无法找到类。但程序没有正常工作。
我应该增强对getCommonSuperClass方法的覆盖,如果发生异常,那么返回java/lang/Object?这很有趣
1.)为什么“使用ASM更新类堆栈映射”?没有理由更新堆栈映射,除非您执行了其他代码转换。但是如果您执行其他代码转换,则这些转换是ASM的主要用途,而不是更新堆栈映射。你应该说一些关于实际的目标。 2)为什么你会删除仍然被代码引用的类? “因为春天总是喜欢做这个东西”并不是一个有意义的解释。 – Holger
因为我需要在运行时插入一些代码。 –
由于在使用tomcat作为嵌入容器时,弹簧引导删除了代码以减小jar大小。 为什么“使用ASM更新类堆栈映射”?---我需要在运行时插入一些代码。 –