首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分提供的默认值(无args构造函数)和声明的构造函数(

区分提供的默认值(无args构造函数)和声明的构造函数(
EN

Stack Overflow用户
提问于 2019-01-19 16:47:04
回答 1查看 48关注 0票数 1

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

代码语言:javascript
复制
class AClass { } // will have a default no args constructor -> public AClass() {}

来自某一特定的,如:

代码语言:javascript
复制
class AClass {
    private final int i;

    public AClass() { i = 0; }
}

检查选项反射库提供的,我无法找到任何允许我区分彼此.

我主要尝试了Class#get*Constructor(s)提供的方法

也许我有隧道视觉,我忘记了什么,或者有另一种方法我错过了.任何帮助都将不胜感激!

编辑:

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

代码语言:javascript
复制
    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.二进制- 7.在源代码中没有对应结构的任何结构必须标记为,但默认构造函数除外,类初始化方法以及Enum类的值和valueOf方法除外。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-19 16:54:59

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

具有默认构造函数的类

代码语言:javascript
复制
class AClass { } // will have a default no args constructor 

被含蓄地编译为

代码语言:javascript
复制
class AClass { 
    AClass() {}
}

第一种形式只是句法糖。

还有你的下一个例子

代码语言:javascript
复制
class AClass {
    private final int i;

    public AClass() { i = 0; }
}

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

代码语言:javascript
复制
class AClass {
    private final int i = 0;
}

此外,我没有看到一个用例,您必须检测到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54269251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档