获取Java类加载引用层次结构

获取Java类加载引用层次结构,java,spring,classloader,aop,aspectj,Java,Spring,Classloader,Aop,Aspectj,在调试Spring驱动的AspectJ LTW(使用-verbose:class)时,我注意到在Spring建立到AspectJ weaver的连接之前,类加载器正在加载一个要建议的类 考虑到Java会延迟类的加载,直到无法再延迟它为止,所以一定有一个原因可以解释为什么这个特定的类加载得如此之快 是否有可能获得在特定时刻将类加载到JVM的“引用堆栈”(这样我就可以尝试推迟它的使用)?如果是这样,我该怎么做呢?正如您已经提到的,Java(或者实际上是运行代码的VM)在需要类的时候加载和解析类。这通

在调试Spring驱动的AspectJ LTW(使用-verbose:class)时,我注意到在Spring建立到AspectJ weaver的连接之前,类加载器正在加载一个要建议的类

考虑到Java会延迟类的加载,直到无法再延迟它为止,所以一定有一个原因可以解释为什么这个特定的类加载得如此之快


是否有可能获得在特定时刻将类加载到JVM的“引用堆栈”(这样我就可以尝试推迟它的使用)?如果是这样,我该怎么做呢?

正如您已经提到的,Java(或者实际上是运行代码的VM)在需要类的时候加载和解析类。这通常也会对几个类产生连锁反应。显然,不包含编织代码的类很有可能在Spring类之前加载

然而,JavaHotSpot虚拟机(安装Oracle Java时的典型虚拟机)在启动时可以以多种方式运行。其中一个选项是“-XX:+TraceClassLoading”(请注意加号;不幸的是,上述链接记录了此选项的减号)。还有另一个选项,它按照引用顺序跟踪加载的类


这样,你就可以缩小问题的范围了。如果不是,一些示例代码可能会有所帮助。尽管我担心,这会有点太大。

在spring有机会提供建议之前,检查可能包含该类并已加载的类路径可能是一个好主意。表示禁用该选项,表示+表示启用该选项,因为它是默认值。您是对的,但是,有多少次,你只是复制/粘贴选项,并想知道,为什么它没有显示任何效果?这种情况经常发生在我身上。:-)谢谢您的建议,但该修饰符只提供了与-verbose:class相同的输出,即在加载类时打印。这对于识别线性和简单的类依赖关系很有用(通过查看以前加载的类),但对于复杂的类就不那么有用了。。。恐怕,要缩小你的问题范围几乎是不可能的。你能举一个简单的例子来说明你的问题吗?或者项目太大了,以至于你无法提取感兴趣的类?也许你可以给我们看一个没有“aspected”的类,或者另一个得到“aspected”的类。这个项目实际上太大了,无法提取相关的类(这就是我试图做的,通过找到类负载的来源)。我认为给你一个没有被编织的类不会有任何区别,因为它不是类本身的问题。当我使用纯AspectJ LTW和aspectjweaver.jar作为java代理时,它是正确编织的,因此AOP配置是正确的。无论如何,我试图编织的是Jetty的HttpClient类,以便记录HTTP请求。