1

java.io (FileInputStream など) からのクラスへの呼び出しをインターセプトするエージェントの UnitTest を作成しようとしています。

私はここで与えられたヒントに従い、ByteBuddys自身のUnitTests を見てきました。

private ClassLoader classLoader;

@Before
@AgentAttachmentRule.Enforce
public void setUp() throws Exception
{
    classLoader = new ByteArrayClassLoader.ChildFirst(getClass().getClassLoader(),
                                           ClassFileExtraction.of(FileInputStream.class),
                                           DEFAULT_PROTECTION_DOMAIN,
                                           AccessController.getContext(),
                                           ByteArrayClassLoader.PersistenceHandler.MANIFEST,
                                           PackageDefinitionStrategy.NoOp.INSTANCE);
}

@Test
public void testAgentForFileInputStream() throws Exception
{
    MyAgent.premain("");
    Class<?> type = classLoader.loadClass(FileInputStream.class.getName());
    type.getDeclaredMethod("open").invoke("test");
}

非 java.* クラスの同様のテストは正常に機能しますが、ここでは次のようになります。

java.lang.SecurityException: Prohibited package name: java.io

at java.lang.ClassLoader.preDefineClass(ClassLoader.java:659)
at java.lang.ClassLoader.defineClass(ClassLoader.java:758)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:197)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ChildFirst.loadClass(ByteArrayClassLoader.java:554)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

SecurityManager を null に設定しようとしましたが、成功しませんでした:

System.setSecurityManager(null);

私が間違っていなければ、そのようなクラスをインターセプトできるはずです。これは、カスタム ClassLoader の使用が原因である可能性があります。でも、どこを変えればいいのかわからない…

4

1 に答える 1