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 是一个 String
或 null
。 bootstrap classloader 应该没有名字......或者(可能)一个你可以区分的名字。
或者,您可以在 class 上调用 Class.forName
,然后在 Class
对象上调用 getClassLoader()
。如果 class 由引导 class 加载程序加载,则该调用将 return null
.
即使您对“内部 class”的定义并不完全意味着“由 bootstrap classloader 加载”,它也可能确实与 classes class加载程序。上面的方法应该仍然有效......经过一些调整。
长话短说:
内部包: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 是一个 String
或 null
。 bootstrap classloader 应该没有名字......或者(可能)一个你可以区分的名字。
或者,您可以在 class 上调用 Class.forName
,然后在 Class
对象上调用 getClassLoader()
。如果 class 由引导 class 加载程序加载,则该调用将 return null
.
即使您对“内部 class”的定义并不完全意味着“由 bootstrap classloader 加载”,它也可能确实与 classes class加载程序。上面的方法应该仍然有效......经过一些调整。