区别提供了默认的无args构造函数与声明的那个

时间:2019-01-19 16:47:04

标签: java reflection

一个简单的问题:如何区分默认构造函数。即:

class AClass { } // will have a default no args constructor -> public AClass() {}

来自以下指定的位置:

class AClass {
    private final int i;

    public AClass() { i = 0; }
}

检查选项反射库提供的信息,使我无法找到使我与众不同的选项...

我主要尝试使用Class#get*Constructor(s)

提供的方法

也许我有洞察力,但我忘记了一些东西,或者有另一种方法我错过了...任何帮助将不胜感激!

编辑:

这是我正在使用的方法,在这里我需要检测这种构造函数是否由用户定义:

    protected void adaptAfterLoading(final Class<?> loadedClass) {
        Arrays.asList(loadedClass.getDeclaredConstructors()).forEach(System.out::println);
        System.out.println("$$$$$$$$$$$ " + loadedClass.getDeclaredConstructors());
        Arrays
                .stream(loadedClass.getDeclaredConstructors())
                .filter(
                        ((Predicate<Constructor<?>>) Constructor::isSynthetic)
                                .negate())
                .map(ConstructorRep::loadFrom)
                .forEach(this::addConstructor);
    }

所以...如果您想知道为什么isSynthetic无法正常工作

来自here

  
    

13.1。二进制格式-     7. Java编译器引入的任何在源代码中没有相应结构的结构,都必须标记为合成 ,默认构造函数 除外,该类是初始化方法,以及Enum类的value和valueOf方法。

  

1 个答案:

答案 0 :(得分:1)

由于已编译的字节码没有区别,因此根本无法检测到这一点。

具有默认构造函数的类

class AClass { } // will have a default no args constructor 

隐式编译为

class AClass { 
    AClass() {}
}

第一种形式只是语法糖。

也是您的下一个示例

class AClass {
    private final int i;

    public AClass() { i = 0; }
}

可以用等效形式的默认构造函数编写

class AClass {
    private final int i = 0;
}

此外,我看不到一个用例,您必须将其检测出来。