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アプリでこれを行っていないので、それが使用するカスタムClassLoaderについては知りません。

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実は、よく見るとこれは・・・の仕業だと思います。

non-null CodeSourceが指定された場合、 aProtectionDomainが構築され、定義されているクラスに関連付けられます。

于 2012-08-19T22:06:32.597 に答える
0

getLocation() は、読み込まれているコードのソースを表す URL を返すようです。しかし、これは常に意味があるとは限りません。マシンにローカルな標準ライブラリとコードに対して何をしますか? 最初とおそらく 2 番目は null を返す必要があります。

于 2012-08-19T21:15:48.903 に答える