首页
学习
活动
专区
圈层
工具
发布

Java规范
EN

Stack Overflow用户
提问于 2012-08-20 05:05:47
回答 3查看 1.2K关注 0票数 0

我有一个javaagent,它可以打印出所有加载的类的名称,以及它们的源代码(它们来自哪里)。

代码语言:javascript
复制
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一无所知。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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的作品...

如果提供了非null CodeSource,则构造ProtectionDomain并将其与正在定义的类关联。

票数 1
EN

Stack Overflow用户

发布于 2012-08-20 05:15:49

看起来像是getLocation()返回了一个表示所加载代码的源代码的URL。但这并不总是有意义的。你对标准库和机器本地代码做了什么?第一个也可能是第二个必须返回null。

票数 0
EN

Stack Overflow用户

发布于 2012-08-20 12:11:07

我不确定您在这里到底想要得到什么,但jvm参数不会:

代码语言:javascript
复制
-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

如果这就是您正在做的所有事情,那么就没有必要为它创建一个代理,尽管我不清楚除了这个之外,您还可能尝试做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12030013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档