2012-06-11 51 views
0

类构造函数的顺序是否在反射中返回不同的结果?Java反射构造函数的订单

我有使用反射的问题。下面是一个例子:

public class A{ 
    public A() 
    { 
     do something here 
    } 
    public A(int i) 
    { 
     do something here 
    } 
} 

然后,在另一个类中,我使用反射来获取与getConstructors构造函数()方法。但这是问题。它只返回带参数的构造函数。

所以我修改了代码,并为改变constructos的顺序:

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()之后的构造函数。它只显示一个构造函数....与旧的排序,但两个构造函数与新的排序。

+6

请提供您正在使用的代码,通过反射来获取构造函数。 –

+2

你确定吗? 'getConstructors'应该返回类的所有构造函数。 'getDeclaredConstructors'做了一些不同的事情。如果两者都表现出非确定性行为,我会很惊讶。 –

+0

我刚刚测试过,它的工作方式与sun jdk 1.6.0_20一样。 – dacwe

回答

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做?如果这是错误的,它将不会返回默认的构造函数。

+0

不,getDeclaredConstructors()仍然会出现同样的问题。 – Helic

+0

在这种情况下,该构造函数看起来并不存在。 –