java - 将提供的默认无参数构造函数与声明的构造函数区分开来
问题描述
简单的问题:如何区分默认构造函数。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 方法除外枚举类。
解决方案
根本无法检测到这一点,因为编译的字节码没有区别。
具有默认构造函数的类
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;
}
此外,我没有看到您必须检测到的用例。
推荐阅读
- javascript - Vue 中的 AxiosCRUD 检查
- python - K 表示集群更新分配
- c# - 属性路由 Visual Studio C#
- c# - ASP.NET Core MVC 在 IIS 8.5 上导致 500 错误
- openssl - 生成自签名证书时 Req 中的 OpenSSL 错误
- git - 从 Git 公共仓库隐藏特定文件
- python - 了解时间戳在 Keras LSTM 中的作用
- node.js - 您可以使用 node-libcurl 设置原始标头吗?
- python - PyQt5 QSortFilterProxyModel 按适当的数据类型(int、float、datetime、string 等)对列进行排序
- python-3.x - Pandas 将多个目录中的 Excel 文件合并到第三个目录中