我有这堂课:
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;
}
答案 0 :(得分:1)
可以使用java.lang.instrument执行此操作。 Kyrill Alyoshin的一个名为“loosejar”的项目使用java.lang.instrument来做我认为你试图在这里做的事情,通过JMX公开它的结果,这样你就可以看到它们在应用程序运行时使用jconsole或jvisualvm。请参阅this blog entry。