在Java中,只要创建了内部类实例,它就与外部类的实例相关联。出于好奇,是否可以将内部类与外部类的另一个实例相关联?

最佳答案

是的,这是可能的,尽管对我来说这听起来似乎是个坏主意。这个想法是使用反射(否则不能保证成功)将否则final指针设置为外部实例。

import java.lang.reflect.*;

public class Me {
    final String name;

    Me(String name) {
        this.name = name;
    }

    class InnerMe {
        String whoAreYou() {
            return name;
        }
    }

    InnerMe innerSelf() {
        return new InnerMe();
    }

    public static void main(String args[]) throws Exception {
        final Me me = new Me("Just the old me!");
        final InnerMe innerMe = me.innerSelf();
        System.out.println(innerMe.whoAreYou()); // "Just the old me!"
        Field outerThis = innerMe.getClass().getDeclaredFields()[0];
        outerThis.setAccessible(true);
        outerThis.set(innerMe, new Me("New and improved me!"));
        System.out.println(innerMe.whoAreYou()); // "New and improved me!"
    }

}

这里的关键部分是outerThis.setAccessible(true);SecurityManager可能会强制执行一项禁止此操作成功的策略。

09-08 07:48