如何在嵌套类中恢复对 this$0 的引用



我想知道是否有办法"手动"恢复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 创建一个修补内部类,并将其转换为其他名称下的类的正确变体。

那将是一些成就。将此类错误的实例转移到新的类对象可能更容易。

相关内容

  • 没有找到相关文章

最新更新