0

我有一个 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 应用程序上执行此操作,因此我不知道它使用的任何自定义类加载器。

4

3 回答 3

1

根据Jetty 7.0.0RC4,它似乎null CodeSource反映了该类具有全局权限。

// 1) if protection domain codesource is null, it is the global permissions (grant {})

此行为记录在 的规范中ClassLoader.defineClass,因此它不是任意的;-)

ProtectionDomain此方法为新定义的类分配默认值。被ProtectionDomain有效地授予了Policy.getPolicy().getPermissions(new CodeSource(null, null))调用时返回的相同权限集。默认域在第一次调用时创建defineClass,并在后续调用中重新使用。


实际上,仔细观察,我相信这是SecureClassLoader.defineClass...

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

于 2012-08-19T22:06:32.597 回答
0

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

于 2012-08-19T21:15:48.903 回答
0

不知道你究竟想在这里得到什么,但不会 jvm 参数:

-verbose:class

已经在做你正在做的事情了吗?

[Loaded sun.nio.cs.SingleByte$Encoder from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.nio.charset.CodingErrorAction from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.nio.ByteBuffer from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.nio.HeapByteBuffer from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.nio.Bits from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.nio.ByteOrder from C:\Program Files\Java\jre7\lib\rt.jar]

如果这就是您正在做的所有事情,则无需为其创建代理,尽管我不清楚除此之外您还可能尝试做什么。

于 2012-08-20T04:11:07.380 回答