有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

问题的简短形式是:

  • 抽象类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怎么知道它是由具体的东西而不是抽象的东西创造的


共 (1) 个答案

  1. # 1 楼答案

    是的,你可以。见示例:

    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方法,如果您真的想从内部类获得它,而不是创建它的方法