Java反射:按声明顺序获取字段和方法

Axe*_*xel 28 java reflection junit

有没有办法按照声明的顺序使用反射获取类声明的字段(和方法)?根据该文件,方法和字段的顺序返回的getFields(),getDeclaredFields()等是不确定的.

使用Java反射中建议的注释可以指定像索引之类的东西:类字段和方法的顺序是否标准化?

有没有更好的选择,即不必手动指定索引?

现在在你问我需要什么之前:我们有一个方法,它将一个非常大的数据结构作为输入,并对其进行冗长的计算.为了创建单元测试,我们创建了一个方法,该方法接受输入对象和输出实例,并创建Java源代码(设置输入,调用计算方法,然后断言正确的结果)作为输出.当字段按声明顺序编写时,此代码更易读.

irr*_*ble 11

使用jdk 6,反射字段按其声明顺序设置.在早期的jdk中并非如此.显然有足够的人唠叨.

虽然javadoc不能保证,但我仍然认为这个顺序是合格的,我认为订单也将保留在未来的jdks中.

在您的应用程序中,就像在大多数应用程序中一样,对声明顺序的依赖主要是虚荣 - 如果订单搞砸了,您的应用程序不会失败,它只会变得有点丑陋.

  • 在Oracle JVM 1.7版上运行,我发现订单与声明顺序不符. (29认同)
  • @irreputable,你能提供一个链接吗?或者这个观察仅基于您的经验? (4认同)
  • Dalvik也与声明顺序不符 (2认同)
  • 它们不在声明的顺序中.我刚试过这个. (2认同)

aio*_*obe 5

不,不可能有反思.但是,你可以使用ProcessBuilderjavap命令解决它:

鉴于Test.java:

public abstract class Test {

    public void method1() {
    }

    public void method2() {
    }

    public static void main(String[] args) {
    }

    public String method3() {
        return "hello";
    }

    abstract void method4();

    final int method5() {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

该命令javap Test打印:

...
public Test();
public void method1();
public void method2();
public static void main(java.lang.String[]);
public java.lang.String method3();
abstract void method4();
final int method5();
...
Run Code Online (Sandbox Code Playgroud)


War*_*voy 5

我有这个作为一个孤立的问题,看看

https://github.com/wmacevoy/kiss/blob/master/src/main/java/kiss/util/Reflect.java

和方法

public static Method[] getDeclaredMethodsInOrder(Class clazz)

它通过查看类的字节码来获取顺序。如果您只想使用库,则是 kiss.util.Reflect.getDeclaredMethodsInOrder(Test.class)