我想知道是否有办法"手动"恢复this$0
的引用,换句话说,恢复嵌套类中的外部类?
这意味着使用名称或methodOuterClass()
或OuterClass.this.Method()
引用外部类的任何方法或属性会导致NullPointerException
。
由于下面列出的问题,例如 Gson,在不引用外部类的情况下构造对象。是否可以在创建对象后修复此问题?
引用
GSON 不反序列化对外部类的引用
在内部类中使用外部类的成员会产生 NULL 异常?
不幸的是,多亏了@BeyelerStudios,他没有把他的评论作为答案。
我用示例代码给出答案:
public class Outer {
protected Inner inner = null;
public Inner getInner() {
return inner;
}
protected void something(){ }
public void function(){
inner.fixParent(this); // solve the reference lost
inner.innerFunction(this);
}
public static void main(String[] args){
String str = "{"inner":{"name"="test"}}";
Outer outer = (new Gson()).fromJson(str,Outer.class);
System.out.println(outer.getInner().name);
outer.function();
}
public class Inner {
public String name = null;
private void fixParent(Outer parent){// solution here
try {
field = Inner.class.getDeclaredField("this$0");
field.setAccessible(true);
field.set(this, parent);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
protected void innerFunction(){
Field field = null;
something();//now works
}
}
}
我遇到了一个现象:
- 可序列化的内部类-外部类不是
在对内部类对象进行反序列化和再次序列化后,
OuterClass.this
null
.
内部类可能应该被设置为静态的。或者非常昂贵,外部类使可序列化。
显然你需要OuterClass
.如果获取了序列化文件,则可以使用相同的 serialVersionUID 创建一个修补内部类,并将其转换为其他名称下的类的正确变体。
那将是一些成就。将此类错误的实例转移到新的类对象可能更容易。