我有一个javaagent,它可以打印出所有加载的类的名称,以及它们的源代码(它们来自哪里)。
public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
System.out.print("Loading class: " + className + "\t");
if (domain != null) {
final CodeSource cs = domain.getCodeSource();
if (cs != null) {
System.out.println(cs.getLocation());
}
}
System.out.println();
return bytes;
}对于某些类,它输出"null“(表示cs.getLocation()为null)。为什么会这样,有没有办法看看这些类是从哪里来的?注意,我不是在我自己的Java应用程序上做这件事,所以我对它使用的任何自定义ClassLoaders一无所知。
发布于 2012-08-20 06:06:33
根据Jetty 7.0.0RC4的说法,null CodeSource似乎反映了该类具有全局权限。
// 1)如果保护域名codesource为空,则为全局权限(grant {})
此行为记录在ClassLoader.defineClass的规范中,因此它不是任意的;-)
此方法将默认
ProtectionDomain分配给新定义的类。有效地授予ProtectionDomain与调用Policy.getPolicy().getPermissions(new CodeSource(null, null))时返回的权限集相同的权限。默认域是在第一次调用defineClass时创建的,并在随后的调用中重用。
实际上,仔细看,我相信这是SecureClassLoader.defineClass的作品...
如果提供了非
nullCodeSource,则构造ProtectionDomain并将其与正在定义的类关联。
发布于 2012-08-20 05:15:49
看起来像是getLocation()返回了一个表示所加载代码的源代码的URL。但这并不总是有意义的。你对标准库和机器本地代码做了什么?第一个也可能是第二个必须返回null。
发布于 2012-08-20 12:11:07
我不确定您在这里到底想要得到什么,但jvm参数不会:
-verbose:class已经在做你在这里做的事了吗?
从C:\Program加载sun.nio.cs.SingleByte$Encoder Files\Java\jre7\lib\rt.jar从C:\Program加载java.nio.ByteBuffer Files\Java\jre7\lib\rt.jar从C:\Program Files\Java\jre7\lib\rt.jar加载java.nio.Bits
如果这就是您正在做的所有事情,那么就没有必要为它创建一个代理,尽管我不清楚除了这个之外,您还可能尝试做什么。
https://stackoverflow.com/questions/12030013
复制相似问题