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

时间:2015-11-20 11:11:55

标签: java reflection

我想知道是否有办法恢复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?

2 个答案:

答案 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.thisnull

内部类应该是静态的。或非常昂贵,外部类使Serializable。

显然你需要OuterClass。如果您获得了序列化文件,则可以使用相同的serialVersionUID创建修补内部类,并将其转换为其他名称下的类的正确变体。

这将是一些成就。将这样一个错误的实例传递给新的类对象可能更容易。