如何在java中获取Object的名称?

像这样,A a = new A(),我怎么能得到一个名字?(从a获得一个字符串“a”)?


有一个JPanel包含一些JTextFields,一个map包含所有JTextFields的名称(变量的名称)。 我想将地图的值设置为JTextFields的文本。

public void mapToJPanel(Map map, JPanel panel) { Component[] compArr = panel.getComponents(); for (Component comp : compArr) { if (comp.getClass().getSimpleName().equals("JTextField")) { JTextField textField = (JTextField) comp; textField.setText(map.get(textField.getName()).toString());//getName() method } } } 

在getName()方法中,我得到null -_-我知道getName()方法不用于获取变量名。 我正在使用netbeans进行Java swing可视化开发,所以我无法重写组件(如JTextField)。

您可以使用Component.setName()为Swing和AWT组件指定名称。

你不能,因为一个对象没有名字。 请考虑以下示例:

 A a = new A(); A b = a; 

现在A实例的“名称”是什么? 它是"a"吗? 是"b"吗?

那怎么样?

 A[] a = new A[] { new A(), new A()}; a[0] = a[1]; 

a[1]实例的“名称”是什么?

我的观点是,您无法提供在各种上下文中工作的通用Java对象名称的有用/可用定义。 包版问题包括:

  • 名称稳定性:分配对象引用时更改的“名称”无用。
  • 单个名称:对象不应同时具有多个名称。
  • 可实现性:任何命名系统都必须是可实现的,而不会对正常使用对象造成性能成本。 AFAIK,这是不可能的……至少在我们目前使用的那种硬件上。

Java最接近对象名称的是对象的“身份哈希码”值。 它不是唯一的,但它具有在当前JVM中对象的生命周期内不会更改的属性。 (但即使是身份哈希码也会以运行时成本出现……这使得某些人看来Java设计错误。)

命名对象的合理方法是(正如其他人所说的)将“名称”字段添加到相关类(或使用现有字段)并根据需要自己管理名称。


在“对象”实际上是JComponent的更具体的情况下,不能依赖给定的组件来获得名称。 ( getName()方法可以返回null 。)但是,如果您愿意,可以遍历任何JComponent层次结构并根据需要在任何组件上设置名称。

你不能。

如果使用调试符号进行编译,那么.class文件将包含一个变量名表(这是调试器将变量映射回源代码的方式),但不能保证它会存在,并且它不会在运行时公开。

你不能,如果你需要这样做,你似乎做错了。 但是,如果您真的想要追求您概述的逻辑,为什么不执行以下操作:

将一个String成员添加到A并在构造函数中指定它。 像这样的东西:

  A a = new A('a'); 

虽然您可以通过调用.getClass()。getCanonicalName()或.getClass()。getSimpleName()(取决于您是否需要完全限定的名称)轻松获取变量类的名称,但这样做并不容易。变量的名称。 Java字节码不需要保留局部变量的名称(使用堆栈上的push / pop操作表示); 但是,Java字节码可能包含注释中的原始名称。 因此,您可以尝试从.jar文件中读取.class文件,并尝试从.class文件中提取变量名称,假设编译器已将它们作为注释包含在内。 对于成员变量(即字段),您可以使用reflection来获取类的字段名称。

名称(符号)a的复制是不方便的,有点吵。 在具有宏的语言中,可以定义这一点,以便在源代码程序中自动复制。

 make(A, a); 

或makeA(a)

您可以尝试定义一个新的Object,它扩展(显式或仅在函数中)原始Object,并为Object的名称添加一个新的String字段。 然后提供在需要时获取该名称的方法。 这种方法对我来说相当不错。

您始终可以在对象的类中创建名称变量,并在其他变量旁边使用该变量来传递有关此对象的信息。

我有同样的问题,看看那个解决方案……

  DocumentoMB mb = new DocumentoMB(); System.out.println(mb.getClass().getSimpleName());