如何在每次加载类或找到资源时执行操作?

时间:2014-08-07 10:15:13

标签: java profiling classloader

我有这堂课:

public class UnusedJarDetector {
    public static void onDefineClass(Class<?> clazz, ClassLoader classLoader) {
       ...
    }
    public static void onGetResource(URL url, ClassLoader classLoader) {
       ...
    }
...

要调用这些方法,我必须从jdk1_6_0_31修补java.lang.ClassLoader并将其添加到bootstrap。但是,修补后的课程当然不适用于其他JRE版本。

upd:是否可以在配置文件模式下启动java并处理defineClass()getResource()的返回值?

--- ClassLoader.java.orig       2014-08-07 11:57:47.851455900 +0400
+++ ClassLoader.java    2014-08-07 12:00:55.045096600 +0400
@@ -612,7 +615,9 @@
                                         ProtectionDomain protectionDomain)
        throws ClassFormatError
     {
-         return defineClassCond(name, b, off, len, protectionDomain, true);
+       Class<?> clazz = defineClassCond(name, b, off, len, protectionDomain, true);
+       UnusedJarDetector.onDefineClass(clazz, this);
+        return clazz;
     }

     // Private method w/ an extra argument for skipping class verification
@@ -1001,6 +1006,7 @@
        if (url == null) {
            url = findResource(name);
        }
+       UnusedJarDetector.onGetResource(url, this);
        return url;
     }

1 个答案:

答案 0 :(得分:1)

可以使用java.lang.instrument执行此操作。 Kyrill Alyoshin的一个名为“loosejar”的项目使用java.lang.instrument来做我认为你试图在这里做的事情,通过JMX公开它的结果,这样你就可以看到它们在应用程序运行时使用jconsole或jvisualvm。请参阅this blog entry