Home > OS >  Byte Buddy: Creating class by implementing interface leads to NoClassFoundException
Byte Buddy: Creating class by implementing interface leads to NoClassFoundException

Time:02-03

I am trying to create a class in a unit test that implements an Interface by using 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

    }
}

Unfortunately I am getting a NoClassFoundException when trying to implement the Interface

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.access$300(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)

Am I missing something during agent initialization?

CodePudding user response:

You are loading the class into a child loader of the boot loader by using

Object::class.java.classLoader

This class loader is of course unaware of SomeInterface. Instead, load the class into a child of:

SomeInterface::class.java.classLoader
  •  Tags:  
  • Related