首页 > 解决方案 > 将提供的默认无参数构造函数与声明的构造函数区分开来

问题描述

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

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 不起作用:

这里

13.1. The Form of a Binary - 7. Java 编译器引入的任何在源代码中没有相应构造的构造都必须标记为合成,但默认构造函数、类初始化方法以及类的 values 和 valueOf 方法除外枚举类。

标签: javareflection

解决方案


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

具有默认构造函数的类

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;
}

此外,我没有看到您必须检测到的用例。


推荐阅读