byte-buddy icon indicating copy to clipboard operation
byte-buddy copied to clipboard

How to redefine dynamically created classes?

Open cilfm opened this issue 6 months ago • 5 comments

byte-buddy version:1.14.19

Firstly, I have successfully dynamically defined a class

com.pf.test.entity.TestEntity

Class<?> entityClass = new ByteBuddy()
        .subclass(BaseEntity.class)
        .name("com.pf.test.entity.TestEntity")
        .defineProperty("name", String.class)
        .defineProperty("cityCode", String.class)
        .make()
        .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
        .getLoaded();

Now I want to add another property to this class

Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
method.setAccessible(true);
Class<?> oldEntityClass = (Class<?>) method.invoke(this.getClass().getClassLoader(), "com.pf.test.entity.TestEntity");

ByteBuddyAgent.install();
Loaded<?> entityClass = new ByteBuddy()
        .redefine(oldEntityClass)
        .name(tableBean.getEntity().getClassName())
        .defineProperty("city_level", Integer.class)
        .make()
        .load(String.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());

bug I get the following exception

java.lang.IllegalStateException: Could not locate class file for com.pf.test.entity.TestEntity
	at net.bytebuddy.dynamic.ClassFileLocator$Resolution$Illegal.resolve(ClassFileLocator.java:118) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:3913) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2192) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.scaffold.inline.RedefinitionDynamicTypeBuilder.make(RedefinitionDynamicTypeBuilder.java:224) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.scaffold.inline.AbstractInliningDynamicTypeBuilder.make(AbstractInliningDynamicTypeBuilder.java:123) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3658) ~[byte-buddy-1.11.22.jar:na]
	at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:3896) ~[byte-buddy-1.11.22.jar:na]

cilfm avatar Aug 19 '24 08:08 cilfm