【问题标题】:Two declared constructors in inner class内部类中的两个声明的构造函数
【发布时间】:2018-03-05 07:05:10
【问题描述】:

我有一个公共类,里面有一个私有类:

public class A {

   private class B
   {
   }

   private final B b = new B();

   public static void main(String[] args) {
       Class<?> bClass = A.class.getDeclaredClasses()[0];
       Constructor<?>[] declaredConstructors = bClass.getDeclaredConstructors();
       System.out.println(declaredConstructors.length);  //result = 2
   }
}

问题是,B 类中声明的构造函数等于 2。

虽然在其他情况下,B 类中的构造函数数量等于 1:

public class A {

   private class B
   {
       public B()
       {
       }
   }

   private final B b = new B();

   public static void main(String[] args) {
       Class<?> bClass = A.class.getDeclaredClasses()[0];
       Constructor<?>[] declaredConstructors = bClass.getDeclaredConstructors();
       System.out.println(declaredConstructors.length);  //result = 1
   }
}

public class A {

   private class B
   {
   }

   public static void main(String[] args) {
       Class<?> bClass = A.class.getDeclaredClasses()[0];
       Constructor<?>[] declaredConstructors = bClass.getDeclaredConstructors();
       System.out.println(declaredConstructors.length);  //result = 1
   }
}

问题是为什么在第一种情况下有 2 个构造函数? 谢谢!

【问题讨论】:

  • 为什么会出现这个问题?
  • 为什么不看看那些构造函数是什么,而不是仅仅担心有多少。
  • @AndyTurner 虽然您肯定是对的,但综合构造函数的概念在阅读 javap 时并不明显。
  • @Henry,我希望有一个构造函数,但我得到了两个。如果 сonstructor 单独存在,为什么会有两个 сconstructor。
  • @AndyTurner 我写了这个作为一个例子,以确保有一个构造函数。

标签: java reflection


【解决方案1】:

正如 chrylis 刚刚提到的,您在这里看到的是合成构造函数。

基本上,每当您从嵌套类访问嵌套类的私有属性时,编译器都需要为此访问创建一个synthetic method

在您的第一个示例中,默认构造函数是私有的,因此当您调用它时会创建一个合成方法(因此存在“2”个构造函数)。

在您的第二个示例中,构造函数被声明为 public,并且不存在此类问题。

在您的第三个示例中,它再次是私有的,但也从未访问过,因此无需创建合成方法。

如果您对更详细的信息感兴趣,请阅读 Java 语言规范 (https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html) 的第 13.1.7 章,其中对其进行了进一步解释。

此外,如果您对合成方法的含义感兴趣,这篇文章可能会让您感兴趣,讨论它们在安全性(和性能)方面的含义:What's the penalty for Synthetic methods?

另外,如果您想深入了解这个概念的内部运作,我可以推荐以下文章:https://www.javaworld.com/article/2073578/java-s-synthetic-methods.html(据我所知)应该仍然是最新的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2019-11-28
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2012-02-14
    相关资源
    最近更新 更多