Skip to content

JDK >= 9的环境中,ClassStructureImplByAsm.getResourceAsStream会返回null #385

Closed
@DayJun

Description

@DayJun

原代码:

private InputStream getResourceAsStream(final String resourceName) {
        return isBootstrapClassLoader()
                ? Object.class.getResourceAsStream("/" + resourceName)
                : loader.getResourceAsStream(resourceName);
    }

    private ClassStructure newInstance(final String javaClassName) {
        ......
        final InputStream is = getResourceAsStream(internalClassNameToResourceName(SandboxStringUtils.toInternalClassName(javaClassName)));
        ......
    }

在JDK 》= 9的情况下,java自己的基础类并不是全部位于同一个包内,而是分为了java.base、java.desktop等好多个模块。使用java.base中的Object.class是无法得到java.desktop等其他模块中类的Resource的URL的。

修改方法:

private InputStream getResourceAsStream(final String javaClassName) {
        final String resourceName = internalClassNameToResourceName(SandboxStringUtils.toInternalClassName(javaClassName));
        InputStream ins = null;
        if(isBootstrapClassLoader()) {
            try {
                Class<?> clz = Class.forName(javaClassName, false, null);
                ins = clz.getResourceAsStream("/" + resourceName);
            } catch (ClassNotFoundException e) {
                // pass
            }
        } else {
            ins = loader.getResourceAsStream(resourceName);
        }
        return ins;
    }

    private ClassStructure newInstance(final String javaClassName) {
        ......
        final InputStream is = getResourceAsStream(SandboxStringUtils.toJavaClassName(javaClassName));
        ......
    }

如果是BootStrapClassLoader加载的类,就先获取到这个类,然后用这个类取get自己的resource

另外,如果getResourceAsStream返回null,会导致UnsupportedMatcher中的isJavaMainBehavior抛出空指针异常

原代码:

    private boolean isJavaMainBehavior(final BehaviorStructure behaviorStructure) {
        final Access access = behaviorStructure.getAccess();
        final List<ClassStructure> parameterTypeClassStructures = behaviorStructure.getParameterTypeClassStructures();
        return access.isPublic()
                && access.isStatic()
                && "void".equals(behaviorStructure.getReturnTypeClassStructure().getJavaClassName())
                && "main".equals(behaviorStructure.getName())
                && parameterTypeClassStructures.size() == 1
                && "java.lang.String[]".equals(parameterTypeClassStructures.get(0).getJavaClassName());
    }

修改后:

    private boolean isJavaMainBehavior(final BehaviorStructure behaviorStructure) {
        final Access access = behaviorStructure.getAccess();
        final List<ClassStructure> parameterTypeClassStructures = behaviorStructure.getParameterTypeClassStructures();
        return access.isPublic() && null != behaviorStructure.getReturnTypeClassStructure()
                && access.isStatic()
                && "void".equals(behaviorStructure.getReturnTypeClassStructure().getJavaClassName())
                && "main".equals(behaviorStructure.getName())
                && parameterTypeClassStructures.size() == 1
                && "java.lang.String[]".equals(parameterTypeClassStructures.get(0).getJavaClassName());
    }

添加一个null != behaviorStructure.getReturnTypeClassStructure()的检测会比较好

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions