Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道类是来自JRE还是来自外部Jar?_Java_Introspection - Fatal编程技术网

Java 如何知道类是来自JRE还是来自外部Jar?

Java 如何知道类是来自JRE还是来自外部Jar?,java,introspection,Java,Introspection,有人知道JRE中是否包含Class变量(是否有库)吗 以下是我想要的: Class-stringClass=String.Class; System.out.println(TheMagickLibrary.isJREClass(stringClass));//应该显示为真 Class-anotherClass=AnyClass.Class; System.out.println(TheMagickLibrary.isJREClass(另一个类));//应该显示为false 我可以为您提供两种解

有人知道JRE中是否包含
Class
变量(是否有库)吗

以下是我想要的:

Class-stringClass=String.Class;
System.out.println(TheMagickLibrary.isJREClass(stringClass));//应该显示为真
Class-anotherClass=AnyClass.Class;
System.out.println(TheMagickLibrary.isJREClass(另一个类));//应该显示为false

我可以为您提供两种解决方案

  • 获取类包并检查它是否以
    java.
    sun.
    com.sun.
  • 获取类的类加载器:
  • 如您所见,他们说“一些实现可能返回null”。这意味着对于这些实现,
    clazz.getClassLoader()==null
    意味着该类由引导类装入器装入,因此属于JRE。顺便说一句,这适用于我的系统(Java(TM)SE运行时环境(build 1.6.0_30-b12))

    如果没有,请检查
    类加载器#getParent()的文档。

    返回委托的父类加载器。某些实现可能会
    使用null表示引导类装入器。这种方法
    如果该类装入器
    父类是引导类装入器。
    
    同样,如果当前类装入器是引导程序,则某些实现将返回null

    最后,我推荐以下策略:

    public static boolean isJreClass(Class<?> clazz) {
        ClassLoader cl = clazz.getClassLoader();
        if (cl == null || cl.getParent() == null) {
            return true;
        }
        String pkg = clazz.getPackage().getName();
        return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun."); 
    }
    
    publicstaticbooleanisjreclass(类clazz){
    ClassLoader cl=clazz.getClassLoader();
    if(cl==null | | cl.getParent()==null){
    返回true;
    }
    字符串pkg=clazz.getPackage().getName();
    返回pkg.startsWith(“java”)| | pkg.startsWith(“com.sun”)| | pkg.startsWith(“sun”);
    }
    

    我相信这对于99%的情况来说已经足够了

    我可以为您提供两种解决方案

  • 获取类包并检查它是否以
    java.
    sun.
    com.sun.
  • 获取类的类加载器:
  • 如您所见,他们说“一些实现可能返回null”。这意味着对于这些实现,
    clazz.getClassLoader()==null
    意味着该类由引导类装入器装入,因此属于JRE。顺便说一句,这适用于我的系统(Java(TM)SE运行时环境(build 1.6.0_30-b12))

    如果没有,请检查
    类加载器#getParent()的文档。

    返回委托的父类加载器。某些实现可能会
    使用null表示引导类装入器。这种方法
    如果该类装入器
    父类是引导类装入器。
    
    同样,如果当前类装入器是引导程序,则某些实现将返回null

    最后,我推荐以下策略:

    public static boolean isJreClass(Class<?> clazz) {
        ClassLoader cl = clazz.getClassLoader();
        if (cl == null || cl.getParent() == null) {
            return true;
        }
        String pkg = clazz.getPackage().getName();
        return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun."); 
    }
    
    publicstaticbooleanisjreclass(类clazz){
    ClassLoader cl=clazz.getClassLoader();
    if(cl==null | | cl.getParent()==null){
    返回true;
    }
    字符串pkg=clazz.getPackage().getName();
    返回pkg.startsWith(“java”)| | pkg.startsWith(“com.sun”)| | pkg.startsWith(“sun”);
    }
    

    我相信这对于99%的情况来说已经足够了

    为什么您需要在运行时知道这一点?请尝试字符串isJREClass(Class cl){return cl.getClassloader().toString();}我需要它来进行Arquillian测试:我想自动发现类使用的所有类,以便将它们添加到测试
    存档中。但是如果它是JRE类型的,就没有必要了,所以我想检测它……为什么在运行时需要知道这个呢?试试字符串isJREClass(Class cl){return cl.getClassloader().toString();}。我需要它来进行Arquillian测试:我想自动发现一个类使用的所有类,以便将它们添加到测试
    存档中。但是如果它是JRE的,就没有必要了,所以我想检测它…我首先测试了第一个解决方案,但后来我意识到一些外部JAR在
    sun.
    java.
    中有类,而在
    javax中有类。
    javax.swing
    尤其是)是JRE的一部分。。。它不是固溶体。我会试试
    getClassLoader()
    one。好的,它似乎有效,谢谢!如图所示,我还尝试了
    clazz.getProtectionDomain().getCodeSource()
    ,并且似乎也能工作(但文档中不太清楚),我认为getProtectionDomain()是正确的解决方案。谢谢你的评论。你为什么这么想@AlexR?
    getCodeSource()
    的Javadoc只是“
    返回这个域的代码源,它可能是空的”
    ”,与父引导加载程序无关……起初我测试了第一个解决方案,但后来我发现一些外部jar在
    sun.
    java.
    中有类,而在
    javax.
    javax.swing
    尤其是)是JRE的一部分…这不是一个可靠的解决方案。我会试试
    getClassLoader()
    一个。好的,它似乎可以工作,谢谢!我也尝试了
    clazz.getProtectionDomain().getCodeSource()
    如图所示,而且似乎也可以工作(但文档中不太清楚)我认为getProtectionDomain()是正确的解决方案。感谢您的评论。为什么您认为@AlexR?用于
    getCodeSource()
    的Javadoc只是“
    返回此域的代码源,可能为空”
    ”,与父引导加载程序无关。。。
    public static boolean isJreClass(Class<?> clazz) {
        ClassLoader cl = clazz.getClassLoader();
        if (cl == null || cl.getParent() == null) {
            return true;
        }
        String pkg = clazz.getPackage().getName();
        return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun."); 
    }