Velvet Star Monitor

Standout celebrity highlights with iconic style.

updates

ByteBuddy - rebase already loaded class

Writer Sebastian Wright

I have the following code working in a SpringBoot application, and it does what's I'm expecting.

TypePool typePool = TypePool.Default.ofClassPath();
ByteBuddyAgent.install();
new ByteBuddy() .rebase(typePool.describe("com.foo.Bar").resolve(), ClassFileLocator.ForClassLoader.ofClassPath()) .implement(typePool.describe("com.foo.SomeInterface").resolve()) .make() .load(ClassLoader.getSystemClassLoader());

Its makes is so that the class com.foo.Bar implements the interface com.foo.SomeInterface (which has a default implementation)

I would like to . use the above code by referring to the class as Bar.class, not using the string representation of the name. But if I do that I get the following exception.

java.lang.UnsupportedOperationException: class redefinition failed: attempted to change superclass or interfaces

I believe due to the fact that it cause the class to be loaded, prior to the redefinition. I'm just now learning to use ByteBuddy.

I want to avoid some reflection at runtime, by adding the interface and an implementation using ByteBuddy. I've some other code that checks for this interface.

1 Answer

This is impossible, not because of Byte Buddy but no tool is allowed to do this on a regular VM. (There is the so-called dynamic code evolution VM which is capable of that).

If you want to avoid the problem, use redefine rather then rebase. Whenever you instrument a method, you do now however replace the original.

If this is not acceptable, have a look at the Advice class which you can use by the .visit-API to wrap logic around your original code without replacing it.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy