如何打印包含对象的变量名称?

时间:2010-10-18 12:39:42

标签: java

如何打印包含我的对象的变量名?

例如,我有:

myclass ob=new myclass()

我如何打印“ob”?

11 个答案:

答案 0 :(得分:15)

对象没有具有名称,除非您碰巧使用允许每个对象被赋予一个的类(例如,通过使用getName()检索的变量)。

特别是,用于引用对象的任何特定变量的名称对于对象本身是完全未知的。所以你做不到:

Object foo = new Object();
// There's no support for this
String name = foo.getName(); // expecting to get "foo"

(请记住,有几个变量都可以引用同一个对象,并且不必是任何引用对象的命名变量。)

答案 1 :(得分:6)

打印对象类型名称:

System.out.println(myObject.getClass().getName());

答案 2 :(得分:4)

System.out.println();用于打印到控制台的命令。

因此,如果您拥有自己创建和实例化的类,则可以执行以下操作:

MyObject obj = new MyObject();
System.out.println(obj);

这会打印toString() MyObject的{​​{1}}实现。默认实现不是很有趣,因此对于有用的信息,您必须覆盖toString()

答案 3 :(得分:1)

略微完整(但基本上与上述相同):

  1. 如果你有一个对象:object.getClass().getName()将为你提供对象的完全限定名称( ie package.className。例如,String thing = new String(); thing.getClass() .getName()将返回“java.lang.String”。
  2. 如果你有一个类名:className.class.getName()将为你提供对象的完全限定名称( ie package.className。例如.String.class.getName()将返回“java。 lang.String”。
  3. 打印它你想要的。也许使用System.out.println()。

    变量的名称是编译时通常不存储的编译时信息。如果使用调试信息进行编译,则存储变量名称。

    在mamy上下文中,想要打印变量名称是一个荒谬的请求,但如果你真的需要这样做,请阅读java调试信息。

答案 4 :(得分:1)

解决方法。如果你想要对象名,那么你可以在构造函数初始化。

//in class myClass

private String objName;

myClass(String objN)
{
    this.objName = objN;
..
}
public String getObjName() {
    return objName;
}
//in main()
.
.
.
myclass ob = new myclass("ob"); //any other variables accessing this object 
                              //eg. temOb = ob get the same object name "ob"
System.out.println("object name is: " + ob.getObjName());
myclass ob1 = new myclass("ob1");
System.out.println("object name is: " + ob1.getObjName());

答案 5 :(得分:0)

我假设您想要一种“打印”对象的方法,在这种情况下,您首先要覆盖对象的toString()方法。这将允许您在调用toString().

时指定类型的对象返回的内容

然后,您只需执行System.out.println(MyObject);

即可

这将隐式调用MyObject的toString()

答案 6 :(得分:0)

您无法获取对象引用的名称。相反,你可以得到它的哈希码或计数器。 我解决了这个问题如下:

class ObjectName
{
    static int num;
    ObjectName()
    {
     num++;
    }

    public int getObjectCount()
    {
        return num;
    }
    public static void main(String[] args) {
        ObjectName ob1=new ObjectName();
        System.out.println(ob1.getClass().getName()+" "+ob1.getObjectCount());
        ObjectName ob2=new ObjectName();
        System.out.println(ob1.getClass().getName()+" "+ob1.getObjectCount());
    }
}

输出:

ObjectName 1
ObjectName 2

答案 7 :(得分:0)

这实现了所需的结果,但它有点像软糖,因为如果toString()返回的字符串实际上是反映变量的名称(当然,只有你,因为编码器会知道),你必须使用该方法使用的约定,即在此实现中,因为返回的字符串的格式为ClassName + counter,你必须使用以下格式命名变量:myClass1,myClass2等。如果你命名你的变量以某种其他方式(例如className + A / B / C等或someRandomVariableName)虽然返回字符串将保持由toString()方法实现,即返回myClass1,myClass2等,它不会反映变量名称你实际上已经在你的代码中使用了。

class myClass {

    private static int counter = 1;
    private String string;
    private int objCounter;

    myClass(String string) {
        this.string = new String(string);
        objCounter = counter;
        counter++;
    }

    @Override
    public String toString() {
        return this.getClass().getName() + objCounter + ": " + this.string;
    }

    public static void main(String[] args) {
        myClass myClass1 = new myClass("This is the text for the first object.");
        myClass myClass2 = new myClass("This is the text for the second object.");
        System.out.println(myClass1);
        System.out.println(myClass2);
    }

}

答案 8 :(得分:0)

尝试反射+哈希码。例如:

String hashcode = ob.hashCode();
String obName;
java.lang.reflect.Field[] fields = 
ob.getClass().getDeclaredFields();

for( final  java.lang.reflect.Field field : fields )
{
  if( field.hashCode().equals(hashcode) )
  {
    obName = field.getName();
    break;
  }
}
System.out.println(obName);

答案 9 :(得分:0)

import java.lang.reflect.*;

public class myclass {
    private myclass ob;

    public static void main(String args[]) {
            Field fd[] = myclass.class.getDeclaredFields();
            for (int i = 0; i < fd.length; i++) {
                  System.out.println(fd[i].getName());
            }
    }
}

答案 10 :(得分:0)

我知道为时已晚))但这里有一个类似 getSimpleName() 的方法。

在这种情况下:

myclass ob=new myclass()
System.out.println(ob.getClass().getSimpleName())

系统输出:ob