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

时间:2012-06-06 15:28:58

标签: java introspection

是否有人知道是否有可能(是否有图书馆)知道JRE中是否包含Class<?>变量?

这就是我想要的:

Class<String> stringClass = String.class;
System.out.println(TheMagickLibrary.isJREClass(stringClass)); // should display true

Class<AnyClass> anotherClass = AnyClass.class;
System.out.println(TheMagickLibrary.isJREClass(anotherClass)); // should display false

1 个答案:

答案 0 :(得分:4)

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

  1. 获取课程包并检查其是否以java.sun.com.sun.
  2. 开头
  3. 获取课程'类加载器:
  4. Returns the class loader for the class.  Some implementations may use
    null to represent the bootstrap class loader. This method will return
    null in such implementations if this class was loaded by the bootstrap
    class loader.
    

    正如你所看到的,他们说“某些意义可能会归零”。这意味着对于这些实现clazz.getClassLoader() == null意味着该类由引导类加载器加载,因此属于JRE。 BTW这适用于我的系统(Java(TM)SE运行时环境(版本1.6.0_30-b12))。

    如果没有,请查看ClassLoader#getParent()的文档:

     Returns the parent class loader for delegation. Some implementations may
     use <tt>null</tt> to represent the bootstrap class loader. This method
     will return <tt>null</tt> in such implementations if this class loader's
     parent is the bootstrap class loader.
    

    同样,如果当前的类加载器是引导程序,则某些实现将返回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."); 
    }
    

    我认为99%的病例已经足够好了。