类构造的顺序是否会在反射中返回不同的结果?
我在使用反射时遇到问题。这是一个例子:
public class A{
public A()
{
do something here
}
public A(int i)
{
do something here
}
}
然后,在另一个类中,我使用反射来获取带有getConstructors()方法的构造函数。但这是问题所在。它只返回带参数的构造函数。
所以我修改了代码并将构造的顺序改为:
public class A{
public A(int i)
{
do something here
}
public A()
{
do something here
}
}
然后,它正确返回两个构造函数。
另一个有趣的观点是OpenJDK可以正常使用两个示例,但Sun JDK没有。我有很多像这样的课程,SunJDK在其中一些课程中表现良好,在其他课程中表现不对。很奇怪。
任何原因?
编辑: 这是一个很大的项目,这里有一些反射代码
Constructor<?>[] constructors = handlerClass.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
Class<?>[] parameterTypes = constructor.getParameterTypes();
System.out.println(“ - ”+ constructor.toString());
if (nonConnection == true && parameterTypes.length == 0) {
return constructor;
} else if (parameterTypes.length > 1) {
continue;
} else if (parameterTypes.length == 1) {
Class<?> parameterType = parameterTypes[0];
if (TableManipulator.class.isAssignableFrom(parameterType))
{
return constructor;
}
}
}
handlerClass是从中获取构造函数的类。
PS。我查看了字节码,除了构造函数的顺序外,字节码是相同的。
编辑: 我添加了一个System.out来显示getParameterTypes()之后的构造函数。它只显示一个构造函数....使用旧的顺序,但两个构造函数具有新的顺序。
答案 0 :(得分:2)
如果你有
public class A{
private /* or non-public */ A()
{
do something here
}
public A(int i)
{
do something here
}
}
你使用getConstructors,只有第二个显示。
如果您使用getDeclaredConstructors(),您将获得所有这些内容。我会尝试这种方法,看看它是否解决了你的问题。
public class A {
public A A() // not a constructor
{
// do something
}
public void A() // not a constructor
{
// do something
}
}
你能删除nonConnection
吗?如果这是false,则不会返回默认构造函数。