有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在运行时加载ASM生成的类

我通过ASM编写了一些字节码(生成的类实现了一些已知的接口)

我还依赖于其他类

现在我想把字节数组连接到某个类中

如何从字节数组加载类

现在我得到NoClassDefFoundError:IllegalName:core/selector/ObjectSelector/codegen/testClass。阶级

我使用以下代码加载类:

@SuppressWarnings("unchecked")
private static <T> SelectorAccess<T> createNewOrNull(byte[] bytesOfClass, String name) {
    try {
        return (SelectorAccess<T>) new ClassLoader() {
            public Class<?> defineClass(byte[] bytes) {
                return super.defineClass(name.concat(".class"), bytes, 0, bytes.length);
            }
        }.defineClass(bytesOfClass).newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
        return null;
    }
}

我想这是因为我的类加载器不知道我的类的依赖关系

我怎样才能避免这个问题


共 (1) 个答案

  1. # 1 楼答案

    好吧,例外情况会指向它:“非法名称:core/selector/ObjectSelector/codegen/testClass.class”。这不是^{}所期望的合法类名:

    Parameters:

    name - The expected binary name of the class, or null if not known

    Binary names

    Any class name provided as a String parameter to methods in ClassLoader must be a binary name as defined by The Java™ Language Specification.

    Examples of valid class names include:

    "java.lang.String"
    "javax.swing.JSpinner$DefaultEditor"
    "java.security.KeyStore$Builder$FileBuilder$1"
    "java.net.URLClassLoader$3$1"
    

    你可以看到这样的画面,这个方法需要一个不带.class后缀的点分隔名称。也就是说,如果类的类文件内部名称真的是core/selecter/ObjectSelector/codegen/testClass,那么defineClass的正确名称应该是core.selecter.ObjectSelector.codegen.testClass

    但是,请注意,提到了将null传递给name参数的可能性