由抽象封闭类创建的匿名内部类可以通过反射确定实现类吗?

时间:2018-01-16 02:49:09

标签: java reflection

问题的简短形式是:

  • 抽象类A1
  • 抽象类A2,用于创建匿名内部A1
  • A3类扩展A2 - A2创建的A1实例是否知道它是在A3?
  • 中创建的

充实问题:

假设我有一个抽象类:

public abstract class Abstract1 {}

然后我有第二个可以创建Abstract1实例的抽象类:

public abstract class Abstract2 {
    protected Abstract1 createAbstract1() {
        return new Abstract1() {};
    }
} 

第三,我有一个具体的Abstract2实现:

public class Concrete extends Abstract2 {} 

让我们将一些打印语句放入Abstract2:

public abstract class Abstract2 {
    public Abstract1 createAbstract1() {
        System.out.println("I am: " + getClass().getName());
        Abstract1 a1 = new Abstract1() {};
        System.out.println("A1 is enclosed by: " + ab1.getClass().getEnclosingClass().getName());
        return a1;
    }
} 

当我们构建Concrete并要求A1如下...

Concrete charlie = new Concrete();
Abstract1 myA1 = charlie.createAbstract1();

...我们看到以下输出:

I am: Concrete
A1 is enclosed by: Abstract2

myA1怎么知道它是由Concrete而不是Abstract2创建的?

1 个答案:

答案 0 :(得分:0)

是的,你可以。见例:

public class App
{
    public static void main(String[] args)
    {
        Concrete charlie = new Concrete();
        Abstract1 myA1 = charlie.createAbstract1();
        myA1.printOuter();
    }
}

abstract class Abstract1
{
    abstract void printOuter();
}

abstract class Abstract2
{
    public Abstract1 createAbstract1()
    {
        System.out.println("I am: " + getClass().getName());
        Abstract1 a1 = new Abstract1()
        {
            @Override
            void printOuter()
            {
                //We can access instance of outer class by "Abstract2.this" 
                System.out.println("My outer class: " + Abstract2.this.getClass().getName());
            }
        };
        System.out.println("A1 is enclosed by: " + a1.getClass().getEnclosingClass().getName());
        System.out.println("Real class of this: " + getClass().getName());
        return a1;
    }
}

class Concrete extends Abstract2
{
}

如果你真的想从内部类中获取它,而不是创建它的方法,我添加了printOuter方法。