Java 如果我有一个classloader实例,我能找到它在哪里查找类字节吗?

Java 如果我有一个classloader实例,我能找到它在哪里查找类字节吗?,java,classpath,classloader,Java,Classpath,Classloader,如果我的类路径中有dira、jarb和dirc,并且我有一个java应用程序,其中有3个具有父/子/孙关系的类加载器,它们会读取相同的目录吗 我想我正在试图找出每个类加载器的位置。。。给定一个类加载器实例,有没有办法找到这个路径?一般来说,不允许类加载器随意构造字节。例如,如果JSP文件具有最近的时间戳,JSP类加载器可能会动态调用JSP编译器 使用-verbose:class标志运行JVM将启用大量日志记录,如果您只是使用标准的引导类加载器,这将对您有所帮助 如果有一些自定义类加载器,您可以提

如果我的类路径中有dira、jarb和dirc,并且我有一个java应用程序,其中有3个具有父/子/孙关系的类加载器,它们会读取相同的目录吗


我想我正在试图找出每个类加载器的位置。。。给定一个类加载器实例,有没有办法找到这个路径?

一般来说,不允许类加载器随意构造字节。例如,如果JSP文件具有最近的时间戳,JSP类加载器可能会动态调用JSP编译器

使用
-verbose:class
标志运行JVM将启用大量日志记录,如果您只是使用标准的引导类加载器,这将对您有所帮助


如果有一些自定义类加载器,您可以提供自己的
URLConnectionFactory
,并查看正在获取哪些URL。

您在这里实际上有几个问题

  • 类路径目录和JAR中的类通常由一个类加载器(应用程序类加载器)加载,而不是由每个条目的几个类加载

  • 如果在父子关系中有类加载器,则子加载器应首先要求其父加载器加载该类,并且仅在父加载器未找到任何内容时才查找字节码本身。(在一些框架中有一些特殊的类加载器,它们以相反的方式来实现这一点。如果每个类只存在一次,那么这应该没有什么区别。)

  • 如果您有一个
    URLClassLoader
    ,那么您可以询问它的
    getURLs()
    方法以了解它从何处加载。对于其他类加载器,可能有也可能没有找到这种方法


看看类加载器API,您会发现有一个方法传递一个名称,最终类加载器传递一个字节[]来定义类。因为它是一个合适的类,所以它可以从它想要的任何地方获取这些字节。ClassLoader只是另一个公共类,任何人都可以实现自己的实现并做自己的事情。类加载器无处不在,我们有读取类路径系统属性的版本,在tomcat中我们有另一个从war文件读取的版本,在osgi中它从jar文件读取。除了简单地读取一些文件之外,每一个都做了一些额外的事情,并且展示了类加载的美丽和灵活性


类加载器上没有返回字符串的方法,因为给定上述类加载器,它将返回什么?一个文件路径,一个jar文件路径?etc

一般来说不是,但在实践中,您经常想知道某个类、资源从何处加载,您可以这样做

System.out.println(someClassLoader.getResource("someResource.txt"));
更有用的是,如果您要查找类来自哪个.class文件,请执行以下操作

Class c = SomeClass.class;
System.out.println(c.getResource(c.getSimpleName() + ".class"));
如果.class文件是动态生成的,则不能保证上述方法有效,但在大多数情况下都有效