字节好友:通过实现接口创建 class 导致 NoClassFoundException

Byte Buddy: Creating class by implementing interface leads to NoClassFoundException

我正在尝试在单元测试中创建一个 class 来使用 byte buddy

实现接口
interface SomeInterface {}

class ByteBuddyTest {

    @Test
    fun byteBuddyTest(){

        val instrumentation = ByteBuddyAgent.install()

        val bb = ByteBuddy()
        val loadedRestController = bb
            .subclass(SomeInterface::class.java)
            .make()
            .load(Object::class.java.classLoader, ClassLoadingStrategy.Default.WRAPPER)
            .loaded

    }
}

不幸的是,我在尝试实现接口时遇到了 NoClassFoundException

org/example/SomeInterface
java.lang.NoClassDefFoundError: org/example/SomeInterface
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.access0(ByteArrayClassLoader.java:56)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassDefinitionAction.run(ByteArrayClassLoader.java:686)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassDefinitionAction.run(ByteArrayClassLoader.java:638)
at java.security.AccessController.doPrivileged(Native Method)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.doPrivileged(ByteArrayClassLoader.java)
at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:405)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)

我是不是在代理初始化过程中遗漏了什么?

您正在使用

将 class 加载到引导加载程序的子加载程序中
Object::class.java.classLoader

这个class加载程序当然不知道SomeInterface。相反,将 class 加载到以下子项中:

SomeInterface::class.java.classLoader