We have an obfuscated class that we need to enhance with bytebuddy. We basically need to redefine one method. Subclassing seemed to not have worked (the code is not executed). Rebasing works but in our intercepted method we need to call the superclass (now talking superclass as in "inheritance" ) method.
class Parent {
public void connect(){
...
};
}
class WeNeedToHackThis extends Parent {
public void connect(InetAddress addr){
//... this is what we want to hack
}
public void connect(){
this.connect(null);
// this is getting called from interceptor :( which delegates to our hacked method
// we need to call "real" superclass's (Parent) method instead
}
}
...
Class<?> dynamic = new ByteBuddy()
.with(TypeValidation.DISABLED)
.rebase(commandBase, locator)
.method(named("connect").and(takesArgument(0, InetAddress.class)))
.intercept(MethodDelegation.to(Session3270ConnectMethod.class))
.make()
.load(Thread.currentThread().getContextClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
//In our interceptor:
public static void connect(InetAddress paramInetAddress,
@Origin Method origin,
@This Object self) throws SessionException {
try {
System.out.println("hi from hijacked");
c.call();
//HOW DO WE CALL SOMETHING LIKE super.connect()
// we need to call Parent.connect();
// but I am stuck at how to access superclass code (new Parent().connect().
// I cant access the Parent class method calls on this object
// if I use @SuperCall or @This then I am getting already overriden version, I need to call the super (Parent's.class) version :(
} catch (Exception e) {
throw new RuntimeException(e);
}
}