Java 如果我有一个classloader实例,我能找到它在哪里查找类字节吗?
如果我的类路径中有dira、jarb和dirc,并且我有一个java应用程序,其中有3个具有父/子/孙关系的类加载器,它们会读取相同的目录吗Java 如果我有一个classloader实例,我能找到它在哪里查找类字节吗?,java,classpath,classloader,Java,Classpath,Classloader,如果我的类路径中有dira、jarb和dirc,并且我有一个java应用程序,其中有3个具有父/子/孙关系的类加载器,它们会读取相同的目录吗 我想我正在试图找出每个类加载器的位置。。。给定一个类加载器实例,有没有办法找到这个路径?一般来说,不允许类加载器随意构造字节。例如,如果JSP文件具有最近的时间戳,JSP类加载器可能会动态调用JSP编译器 使用-verbose:class标志运行JVM将启用大量日志记录,如果您只是使用标准的引导类加载器,这将对您有所帮助 如果有一些自定义类加载器,您可以提
我想我正在试图找出每个类加载器的位置。。。给定一个类加载器实例,有没有办法找到这个路径?一般来说,不允许类加载器随意构造字节。例如,如果JSP文件具有最近的时间戳,JSP类加载器可能会动态调用JSP编译器 使用
-verbose:class
标志运行JVM将启用大量日志记录,如果您只是使用标准的引导类加载器,这将对您有所帮助
如果有一些自定义类加载器,您可以提供自己的
URLConnectionFactory
,并查看正在获取哪些URL。您在这里实际上有几个问题
- 类路径目录和JAR中的类通常由一个类加载器(应用程序类加载器)加载,而不是由每个条目的几个类加载
- 如果在父子关系中有类加载器,则子加载器应首先要求其父加载器加载该类,并且仅在父加载器未找到任何内容时才查找字节码本身。(在一些框架中有一些特殊的类加载器,它们以相反的方式来实现这一点。如果每个类只存在一次,那么这应该没有什么区别。)
- 如果您有一个
,那么您可以询问它的URLClassLoader
方法以了解它从何处加载。对于其他类加载器,可能有也可能没有找到这种方法getURLs()
类加载器上没有返回字符串的方法,因为给定上述类加载器,它将返回什么?一个文件路径,一个jar文件路径?etc一般来说不是,但在实践中,您经常想知道某个类、资源从何处加载,您可以这样做
System.out.println(someClassLoader.getResource("someResource.txt"));
更有用的是,如果您要查找类来自哪个.class文件,请执行以下操作
Class c = SomeClass.class;
System.out.println(c.getResource(c.getSimpleName() + ".class"));
如果.class文件是动态生成的,则不能保证上述方法有效,但在大多数情况下都有效