簡體   English   中英

如何打印保存對象的變量名稱?

[英]How do I print the variable name holding an object?

如何打印保存對象的變量名稱?

例如,我有:

myclass ob=new myclass()

我將如何打印“ob”?

對象沒有名字,除非你碰巧使用的一類,它允許給予一個每一個對象(例如,通過一個變量檢索getName()

特別是,用於引用對象的任何特定變量的名稱對於對象本身來說是完全未知的。 所以你不能這樣做:

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

(請記住,多個變量都可以引用同一個對象,並且不必有任何命名變量引用一個對象。)

要打印對象類型名稱:

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

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

因此,如果您創建並實例化了自己的類,則可以執行以下操作:

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

這將打印出MyObjecttoString()實現。 默認實現不是很有趣,因此要獲得有用的信息,您必須覆蓋toString()

解決方法。 如果你想要對象名稱,那么你可以在構造函數中初始化。

//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());

稍微完整一點(但與上面基本相同):

  1. package.className. For example, String thing = new String(); thing.getClass().getName() will return "java.lang.String".如果您有一個對象: object.getClass().getName()將為您提供該對象的完全限定名稱(package.className。例如,String thing = new String(); thing.getClass().getName( ) 將返回“java.lang.String”。
  2. package.className. For example. String.class.getName() will return "java.lang.String".如果你有一個類名: className.class.getName()會給你對象的完全限定名(package.className。例如。String.class.getName() 將返回“java.lang.String”。

隨心所欲地打印它。 也許使用 System.out.println()。

變量的名稱是編譯時信息,通常不會在編譯后存儲。 如果您使用調試信息進行編譯,則會存儲變量名稱。

在大多數情況下,想要打印變量名稱是一個荒謬的請求,但如果您確實需要這樣做,請閱讀 Java 調試信息。

嘗試反射 + 哈希碼。 例如:

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);

我假設您想要一種“打印”對象的方法,在這種情況下,您首先要覆蓋對象的toString()方法。 這將允許您在調用toString().時指定您的類型的對象返回的內容toString().

然后,您可以簡單地執行System.out.println(MyObject);

這將隱式調用 MyObject 的toString()

您無法獲得對象引用的名稱。 相反,您可以獲取其哈希碼或計數器。 我解決這個問題如下:

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

這實現了所需的結果,但它有點虛偽,因為如果 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);
    }

}
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());
            }
    }
}

我知道為時已晚))但是這里有一個像getSimpleName()這樣的getSimpleName()

在這種情況下 :

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

系統輸出:ob

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM