Kotlin/Java - 如何识别内部包?

Kotlin/Java - How to identify internal packages?

长话短说:

内部包:Java 程序无需导入外部 jar 或显式指定额外类路径即可使用的包,如 java.lang.Exception.

我需要这个函数的实现:

/**
 * @param package Package name (Eg. "java.lang.Exception")
 * @return True if this package is an internal package.
 */
fun isInternal(package: String): Boolean
{
    // What is the most efficient implementation here?
}

案例:

isInternal("java.lang.Exception") // true
isInternal("org.hydev.Test") // false
isInternal("com.sun.net.httpserver") // true
isInternal("sun.misc.BASE64Encoder") // true
isInternal("javax.xml.ws") // true
// But there must be more internal packages that don't start with java. or com.sun. or sun.

长话短说:

我正在构建 HyLogger,一个专注于颜色编码的记录器库,这就是我遇到的问题 运行:

调用 Throwable.printStackTrace() 时,堆栈跟踪中不是来自我的记录器库的第一个条目将是 java.lang.Throwable$WrappedPrintStream.println:749。因此,在通过堆栈跟踪搜索 FQCN 最有用的条目时,需要过滤内部包。一个简单的解决方案是过滤掉以 java.sun.com.sun. 开头的条目,但必须有比这三个更多的内部包前缀,这就是我问这个问题的原因。

在我看来,您对“内部 class”的定义对应于由 JVM 的 bootstrap classloader 加载的 class。

从 Java 9 开始,StackTraceElement class 有一个名为 getClassLoaderName() (javadoc) 的方法。如果 classloader 没有名字,这个 return 是一个 Stringnull。 bootstrap classloader 应该没有名字......或者(可能)一个你可以区分的名字。

或者,您可以在 class 上调用 Class.forName,然后在 Class 对象上调用 getClassLoader()。如果 class 由引导 class 加载程序加载,则该调用将 return null.


即使您对“内部 class”的定义并不完全意味着“由 bootstrap classloader 加载”,它也可能确实与 classes class加载程序。上面的方法应该仍然有效......经过一些调整。