Below is the anonymous inner class definition:
package com.demo;
public class OuterClass {
private static int staticNum = 1;
private int instanceNum = 2;
public Runnable redefineMe() {
return new Runnable() {
@Override
public void run() {
System.out.printf("staticNum %d, instanceNum %d \n", staticNum, instanceNum);
}
};
}
}
Below is the running example:
package com.demo;
import javassist.*;
public class Test {
public static void main(String[] args) throws NotFoundException, CannotCompileException {
ClassPool pool = ClassPool.getDefault();
CtClass outerClass = pool.get("com.demo.OuterClass");
CtClass[] nestedClasses = outerClass.getNestedClasses();
CtMethod run = nestedClasses[0].getDeclaredMethod("run");
run.setBody("{" +
"System.out.println(\"staticNum: \" + com.demo.OuterClass.staticNum);" + // print: staticNum: 1
// I tried to use the following code to access instance variables, but a compilation error occurred
// "System.out.println(\"staticNum: \" + instanceNum);" + // [source error] no such field: instanceNum
// "System.out.println(\"staticNum: \" + com.demo.OuterClass.this.instanceNum);" + // [source error] missing member name
// "System.out.println(\"staticNum: \" + com.demo.OuterClass.access$100(com.demo.OuterClass.this));" + // [source error] missing member name
"}");
nestedClasses[0].toClass();
outerClass.toClass();
new OuterClass().redefineMe().run();
}
}
I want to redefine the body of the run method, but I cannot access the instance variables of the outer class in the body