一个简单的问题:如何区分默认构造函数。即:
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方法。
答案 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;
}
此外,我看不到一个用例,您必须将其检测出来。