方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。因为方法中的代码是由上而下顺序执行的,方法运行结束后,局部变量就被销毁,内部类的生命周期可能会比局部变量的生命周期长;看下面的代码,方法中的内部类 Inner.class 调用方法中的局部变量 x ,正常调用的时候内部类能够调用到方法中的局部变量,并将内部类对象 inner 返回,正常调用结束后,如果方法中的局部变量 x 没有被 final 关键字修饰,x 则会被销毁,我们再通过反射的方式去调用 x 的时候则会发现找不到变量 x ,如果局部变量 x 被 final 关键字修饰后,则 x 在方法运行结束后不会被销毁,而是常驻在内存中直到 JVM 退出,这样再通过反射调用的时候依然可以找到 x 。
import java.lang.reflect.Method;
public class InnerClassCallLocalVar {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) throws Exception {
Outer outer = new Outer(); // 正常调用
Object object = outer.outerfun();
Class clazz = object.getClass(); // 反射调用
Method method = clazz.getMethod("innerfun");
method.invoke(object);
}
}
class Outer {
public Object outerfun() {
final int x = 5;
class Inner {
public void innerfun() {
System.out.println(x);
}
}
Inner inner = new Inner();
inner.innerfun();
return inner;
}
}
|