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

时间:2010-05-24 00:33:04

标签: 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
        }
    }
}

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

9 个答案:

答案 0 :(得分:16)

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

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层次结构,并根据需要在任何组件上设置名称。

答案 1 :(得分:6)

你不能。

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

答案 2 :(得分:6)

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

答案 3 :(得分:1)

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

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

 A a = new A('a');

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

make(A, a);

或     makeA(a)中

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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

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