繁体   English   中英

Java Reflection构造函数命令

[英]Java Reflection constructors orders

类构造的顺序是否会在反射中返回不同的结果?

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

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

如果你有

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,则不会返回默认构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM