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

Kea*_*ang 9 java

像这样,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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 16

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

A a = new A();
A b = a;
Run Code Online (Sandbox Code Playgroud)

A现在这个实例的"名称"是什么?是"a"吗?是"b"吗?

那怎么样?

A[] a = new A[] { new A(), new A()};
a[0] = a[1];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


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


Chr*_*ris 6

你不能.

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


Mic*_*rdt 6

您可以使用Component.setName()为Swing和AWT组件命名.