我想知道是否有办法恢复this$0
的“手动”引用,换句话说,是嵌套类中的外部类?
这意味着使用methodOuterClass()
中的名称或OuterClass.this.Method()
或NullPointerException
结果引用外部类的任何方法或属性。
由于下面列出的问题,例如: Gson,构造对象而不引用外部类。在创建对象后可以修复它吗?
参考
GSON does not deserialize reference to outer class
using member of outer class in a inner class makes null exception?
答案 0 :(得分:3)
感谢@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
}
}
}
答案 1 :(得分:0)
我遇到了一种现象:
再次对内部类对象进行反序列化和序列化后,
OuterClass.this
为null
。内部类应该是静态的。或非常昂贵,外部类使Serializable。
显然你需要OuterClass
。如果您获得了序列化文件,则可以使用相同的serialVersionUID创建修补内部类,并将其转换为其他名称下的类的正确变体。
这将是一些成就。将这样一个错误的实例传递给新的类对象可能更容易。