Java - 反射getDeclaredMethods在声明的顺序奇怪的行为

Alp*_*a2k 1 java reflection

这是一个奇怪的行为getDeclaredMethods,这里是场景,一个名为Entity的类:

public class Entity {
private Object reference;

/**
 * @return the reference
 */
public Object getReference() {
    return reference;
}

/**
 * @param reference the reference to set
 */
public void setReference(Object reference) {
    this.reference = reference;
}

public Object getReference2() {
    return reference;
}

public void setReference2(Object reference) {
    this.reference = reference;
}
}
Run Code Online (Sandbox Code Playgroud)

而主要课程:

public static void main(String Args[]){
    try {
        Entity _entity = new Entity();


        Class _newClass = _entity.getClass();
        Method[] _method = _newClass.getDeclaredMethods();
        for (int i = 0; i < _method.length; i++) {
            System.out.println(_method[i]);
        }


    } catch (IllegalArgumentException | SecurityException ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

public java.lang.Object Entities.Entity.getReference()
public void Entities.Entity.setReference(java.lang.Object)
public java.lang.Object Entities.Entity.getReference2()
public void Entities.Entity.setReference2(java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

好吧,他们是有序的,没关系,但是这会发生在你将setRefference设置为某个东西_entity.setReference(100);时输出:

public void Entities.Entity.setReference(java.lang.Object)
public java.lang.Object Entities.Entity.getReference()
public java.lang.Object Entities.Entity.getReference2()
public void Entities.Entity.setReference2(java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

所以...为什么setReference要放在第一位?也许是因为它有价值?无论我设置哪个字段,如何保持声明的顺序,就像它在类文件中一样?

Jon*_*eet 6

无论我设置哪个字段,如何保持声明的顺序,就像它在类文件中一样?

你不能,用getDeclaredMethods.该文档是对此非常清楚:

返回数组中的元素未排序,并且不按任何特定顺序排列.

我不清楚订单是否存在于字节码中 - 您可能需要代码才能确定原始排序.

最好不要完全依赖于排序 - 或者按照你想要的任何确定性顺序对数组进行排序.