如果我有一个类加载器实例,我可以找到它查找类字节的位置吗?

时间:2011-03-14 23:27:53

标签: java classpath classloader

如果我按类顺序在类路径中有dira,jarb和dirc,并且我有一个带有3个类加载器且具有父/子/孙关系的java应用程序,它们是否都会读取相同的目录?

我想我想弄清楚每个类加载器的外观......有没有办法在给定类加载器的实例的情况下找到这个路径?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这里有几个问题。

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

  • 如果你有一个父子关系中的类加载器,那么孩子应该首先要求它的父加载该类,并且只在父母没有找到任何内容时才查找字节码本身。 (在某些框架中有特殊的purpuse类加载器,反之亦然。如果每个类只存在一次,那么这应该没有区别。)

  • 如果您有URLClassLoader,那么您可以询问其getURLs()方法,以了解其加载位置。对于其他类加载器,可能有也可能没有办法找到它。

答案 2 :(得分:0)

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

ClassLoader上没有返回String的方法,因为在给定上述CLassLoaders的情况下会返回什么?文件路径,jar文件路径?等

答案 3 :(得分:0)

一般来说没有,但在实践中,你经常想找出一些类,资源从哪里加载,你可以做到,

System.out.println(someClassLoader.getResource("someResource.txt"));

更有用的是,如果你想找到一个Class来自哪个.class文件,请执行

Class c = SomeClass.class;
System.out.println(c.getResource(c.getSimpleName() + ".class"));

如果动态生成.class文件,则无法保证上述功能,但在大多数情况下均可使用。

相关问题