有保证的方法可以在运行时获取成员字段的源顺序吗?

2024-03-26

我正在寻找一种按源顺序检索(在运行时)类的字段的方法,以便我可以执行自己的“初始化处理”,该处理基于声明的顺序。我知道 Javadoc 用于Class.getDeclaredFields()明确指出不保证订单。

SO 上的一些答案指向Javassist但我找不到任何证据表明javassist在没有行号信息的情况下有任何此类保证。

然而 Java 编译器使用了这种“源代码顺序”,因为此代码无法编译:

private int a = 10 * b;
private int b = 5;

显然,价值b目前尚不清楚a正在宣布。

这个初始化顺序也必须出现在字节码中,因为在运行时初始化必须以相同的顺序发生(当然,这只是这些边缘情况的要求:-(但这让我认为自然的事情是存储里面的源顺序.class file.

问题:

  1. JVM/字节代码如何按照声明的顺序初始化成员字段,这些信息是否可以用于重建字段的源顺序?

  2. 有没有其他有保证的方法可以实现同样的目标。像Javassist这样的第三方工具是可以的,但它必须是“有保证的”或者至少是“在特定条件下有保证”。

  3. 是否有任何特定的 Java 实现可以保证顺序Class.getDeclaredFields()(也许在特定条件下(哪些条件))?

供您参考,我需要源顺序来重建顺序很重要的遗留语言的行为。我不喜欢明确添加订单,例如通过添加数组或注释,因为我想保持源代码尽可能可读。

- 编辑 - 一个重要的注意事项可能是我需要“遍历”的字段都将被注释,例如@MyComplexType(len = 4)。父类将需要此元信息来构造一种内存映射。然而,我不想让这个注释与订购信息混淆,因为我发现这会妨碍可读性和可维护性。


关于你的第二个问题和第三个问题,只能使用一种肮脏的黑客方法按顺序检索字段:

在字节码中,类文件的字段和方法都不是按顺序存储的。我不知道why情况确实如此(尽管我制作了自己的 JVM 编译器),但我相信 Java 编译器只是决定这样做。Class.getDeclaredFields按照从字节码读取字段的顺序返回字段,这就是为什么它声明不保证顺序。

如果您仍然想让它们按顺序排列,我会尝试以下操作:您使用字节码解析器库(例如 Javassist 或 ASM)来读取类文件,并跳过除构造函数(以及static {}如果您还想对静态字段进行排序)。一旦你遇到一个PUTFIELD or PUTSTATIC指令的owner是您正在检查的类,您可以通过字节码中存储的调试信息获取可用的当前行,并使用它对字段进行排序。这种技术的问题是效率低下,而且它依赖于行号属性,而这些属性并不总是存在于类文件中。此外,你只会发现PUT*显式初始化字段的说明,默认字段,例如

protected int modifiers;

未由编译器初始化,因此字节码中没有可用的指令和行号信息。在这种情况下,或者当一般没有 LineNumber 属性时,您很不幸地运气不好。此时,我能想到的唯一解决方案就是阅读该类的实际源代码。

根据您尝试检查的类,您可能无法获取该类的实际字节码,但这本身就是一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有保证的方法可以在运行时获取成员字段的源顺序吗? 的相关文章

  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • OQL 包中的所有实例

    是否有可能在OQL检索属于一个包的所有对象 或者我可以查询wildcards 正如 haridsv 建议我尝试过的 SELECT from com example and SELECT a from com example but in V
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上

随机推荐

  • Export-CSV 仅获取“长度”

    当我尝试导出到 CSV 列表时 我只得到 长度 的所有数字 Count属性 直到到达分割点 然后将 CSV 数组分割到一个新文件 并使用从此时开始使用的新名称 可能是什么问题 RootFolder Get Content c DRIVERS
  • `agrep(...,fixed=F)` 的困难

    In agrep grep模糊匹配 它提到我可以设置参数fixed FALSE让我的模式被解释为正则表达式 但是 我无法让它工作 agrep asdf fdsa asdf fixed F integer 0 以上should匹配正则表达式
  • 使用 Codeigniter 将复选框值传递到 mysql 数据库

    我正在使用 CodeIgniter 和 mySQL 构建复选框表单 该表格包含 4 个选项 每个选项只有一个复选框 用户可以选择选项的任意组合 我想做以下事情 1 对于每个复选框 使用值 1 如果未选中 或 2 如果选中 并将这些值传递到数
  • 第一个项目需要注意什么

    我想创建一个程序 它将接受用户输入并创建一个 使用输入的日历 示例 约翰 康纳 2010 年 1 月 3 日生日 此信息还可按明显的顺序排序 姓氏 名字 日期 其他 它将能够将此信息打印为列表或日历 必须有例外 例如 1 3 10 放在 2
  • JTable 编辑/取消编辑代码不适用于重新排列的 JTable 列

    我使用以下代码对 JTable 列进行编辑 取消编辑 但是当用户重新排列列时 以下代码不起作用 SSCCE的代码如下 import javax swing JTable import javax swing table DefaultTab
  • System.Web.Routing.RouteCollection.GetRouteData 中的异常

    我在 iis7 上运行的 ASP NET MVC 代码中随机出现两个异常 Exception type InvalidOperationException Exception message Collection was modified
  • jquery Accordion - 从外部链接单击返回时记住活动区域

    我的链接位于页面上的 jquery 手风琴内部 当访问者单击其中一个链接然后单击后退按钮返回我的页面时 我希望打开包含该链接的手风琴 我的假设是我应该使用 navigation true 设置并将主题标签添加到不同的手风琴 但这对我不起作用
  • Instagram 基本显示 API 错误 - 无效范围:['basic'] 或无效的 redirect_uri

    我正在使用 Magento 2 4 1 安装了社交登录扩展 并在登录 Instagram 时出现以下错误 我正在使用混合身份验证库进行登录 error type OAuthException 代码 400 error message 无效
  • Linux Xwindow 转发上的 Visual Studio Code

    我的配置如下 OS DISTRIB ID Ubuntu DISTRIB RELEASE 14 04 DISTRIB CODENAME trusty DISTRIB DESCRIPTION Ubuntu 14 04 4 LTS NAME Ub
  • 更新 my.cnf 中的变量

    I set lower case table names 2在 my cnf 文件中 设置变量后 我重新启动了 mysql 服务器 但当我使用时 该值仍然是 0SHOW VARIABLES 我正在使用 MySQL 5 5 任何想法还需要做什
  • HTML:阻止子元素继承父元素的 [title] 属性

    问题是 当我为 wrapper 元素声明标题属性时 当光标落入 content 元素内时 也会显示工具提示 如何防止这种情况 继承 发生 div title example div div div 我只想显示工具提示between cont
  • 如何使用 gradle 任务解析 .json 文件并从中获取 json 数据?

    有没有一种方法可以在 gradle 任务的帮助下解析 xyz json 文件并获取其中的所有单独的 json 数据 例如 我想解析存储在我的资产文件夹中的 xyz json 文件中的数据并获取其中的所有值 例如 获取 类型 的值 type
  • 在CSS中创建凹角[重复]

    这个问题在这里已经有答案了 是否可以在CSS中创建这样的凹角 如果是 你会怎么做 莉亚 维鲁有一个如何执行此操作的描述 http lea verou me 2011 03 beveled corners negative border ra
  • 使用 jQuery getJSON 时 JSON Feed 返回 null

    http portlandonline com shared cfm json cfm c 27321 http portlandonline com shared cfm json cfm c 27321 它返回 null 我真的无权接触
  • 匿名委托中捕获的私有字段

    class A public event EventHandler AEvent class B private A foo private int bar public void AttachToAEvent foo AEvent del
  • 数据工厂子项修改或创建日期

    我有一个数据工厂 V2 管道 由 获取元数据 和 forEach 活动组成 用于读取文件共享 本地 上的文件列表并将其记录在数据库表中 目前 我只能读取文件名 但还想检索每个文件的修改日期和 或创建日期属性 有什么帮助吗 谢谢 Accord
  • 使用SQL计算时间序列中的时间间隔

    我有一个像这样的 MySQL 表 CREATE TABLE IF NOT EXISTS vals DT datetime NOT NULL value INT 11 NOT NULL PRIMARY KEY DT DT 是唯一的日期和时间
  • iOS 自定义字体已移位

    对于一个项目我买了一个OTF字体并将其包含到我的项目中 添加到 plist 文件等 它有效 我可以在按钮上设置字体 但标签会被替换 我添加了屏幕截图 以便您可以看到我的问题 有人知道问题出在哪里吗 系统 iPad 3 iOS 6 0 bet
  • 有什么办法可以提取底层Xaml吗?

    无论如何 是否可以从控件中提取底层 xaml IE 我有一个名为 fooBox 的文本框 我可以在运行时从文本框获取代表文本框的 xaml 吗 这向您展示了完整的生命周期 从控件到 XAML 再到控件 如你看到的 string s Xaml
  • 有保证的方法可以在运行时获取成员字段的源顺序吗?

    我正在寻找一种按源顺序检索 在运行时 类的字段的方法 以便我可以执行自己的 初始化处理 该处理基于声明的顺序 我知道 Javadoc 用于Class getDeclaredFields 明确指出不保证订单 SO 上的一些答案指向Javass