简单问题:如何区分默认构造函数。即:
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.二进制- 7.在源代码中没有对应结构的任何结构必须标记为,但默认构造函数除外,类初始化方法以及Enum类的值和valueOf方法除外。
发布于 2019-01-19 16:54:59
没有办法检测到这一点,因为编译后的字节码没有区别。
具有默认构造函数的类
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;
}此外,我没有看到一个用例,您必须检测到这一点。
https://stackoverflow.com/questions/54269251
复制相似问题