当前位置: 首页 > 知识库问答 >
问题:

Java-反射按声明顺序获取declaredMethods奇怪的行为

单于正业
2023-03-14

这是发生在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;
}
}

主要课程包括:

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);
    }
}

输出:

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)

好的,它们是有序的,这很好,但是当您设置对某个\u实体的引用时,就会发生这种情况。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)

所以为什么setReference放在首位?也许因为它有价值?无论我设置了哪些字段,如何保持声明的顺序与类文件中的顺序相同?


共有1个答案

梁宪
2023-03-14

无论我设置了什么字段,如何保持类文件中声明的顺序?

使用getDeclaredMethods,您不能这样做。文件对此非常清楚:

返回数组中的元素没有排序,也没有任何特定的顺序。

我不清楚字节码中是否存在顺序-您可能需要源代码来确定原始顺序。

不过,最好根本不依赖于排序,或者按照您想要的确定顺序对数组进行排序。

 类似资料:
  • 问题内容: 有什么方法可以使用反射来按声明的顺序获取声明的类的字段(和方法)?根据该文件,方法和字段的顺序返回的,等不确定。 如Java反射中所建议的那样,可以使用注释来指定类似索引的内容:类字段和方法的顺序是否标准化? 有没有更好的选择,即不必手动指定索引? 现在,在您问我需要什么之前:我们有一个方法将一个很大的数据结构作为输入并对其进行冗长的计算。为了创建单元测试,我们制作了一个方法,该方法采

  • 问题内容: 当通过反射(即,使用方法)访问在字段上定义的注释时,Java 6或7规范对返回注释的顺序做了任何保证。我已经检查了相关的Java文档,但似乎找不到确切的答案。 问题答案: 这确实有点不足。让我们从可重复批注的Java 8功能入手,因为它有一些地方: JLS第9.7.5节。相同类型的多个注释: 隐式声明的注释称为 容器注释 ,而出现在上下文中的多个类型的 注释 称为 基础注释 。容器批注

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • 我有一个表单组件,它从其父级获取其状态。表单组件只呈现一些输入字段和其他字段。 父组件使用useReucer并将值向下传递给表单组件。 有两个父组件,一个允许用户使用表单创建,另一个允许他们编辑。 在编辑父组件中,我使用useEffect从api获取数据,并从服务器设置初始状态。 在开发构建中,当组件呈现时,有时会出现以下错误: 超过最大更新深度。当组件在componentWillUpdate或c

  • 我在React hook中遇到了一些非常奇怪的行为。在下面的代码中(https://codesandbox.io/s/purple-bush-nb5uy?file=/src/index.js): 单击时,我们在控制台中获得以下序列: 我希望: 因为我认为如果React找到setter并在重新渲染后执行以下代码,它会立即重新渲染。此外,我的React应用程序也是如此: 当运行以及值与状态变量的内容不

  • 我发现了Java并发的奇怪行为。请参阅下面的下一段代码: 在我看来,这段代码应该挂起并永远等待,但是在控制台中的next out没有任何问题地完成了代码: 我试图找到一些关于如果线程死了通知锁的信息,但缺乏。我也没有在Java规范中找到任何信息。 但是如果我试图锁定其他对象(而不是thread对象),就会像我预期的那样工作得很好。