Как распечатать имя переменной, содержащую объект?

Как напечатать имя переменной с моим объектом?

Например, у меня есть:

myclass ob=new myclass()

Как мне напечатать "ob"?

Ответ 1

У объектов нет имен, если только вы не используете класс, который позволяет каждому объекту присваивать один (например, через переменную, полученную с помощью getName()).

В частности, имя любой конкретной переменной, используемой для ссылки на объект, полностью неизвестно самому объекту. Поэтому вы не можете:

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

(Имейте в виду, что несколько переменных могут ссылаться на один и тот же объект, и не обязательно должны быть какие-либо именованные переменные, относящиеся к объекту.)

Ответ 2

Чтобы напечатать имя типа объекта:

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

Ответ 3

System.out.println(); Используется ли команда для печати на консоли.

Итак, если у вас есть свой собственный класс, который вы создали и создали, вы можете сделать:

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

и это приведет к печати toString() реализации MyObject. Реализация по умолчанию не очень интересна, поэтому для полезной информации вам придется переопределить toString().

Ответ 4

Чуть более полный (но по существу такой же, как и выше):

  • Если у вас есть объект: object.getClass().getName() даст вам полное имя объекта ( ie package.className. Например, String thing = new String(); thing.getClass(). GetName() вернет "java.lang.String".
  • Если у вас есть имя класса: className.class.getName() даст вам полное имя объекта ( ie package.className. Например, String.class.getName() вернет "java.lang. Строка".

Распечатайте его, как вы хотите. Возможно, используя System.out.println().

Имя переменной - это информация времени компиляции, которая обычно не сохраняется после компиляции. Имя переменной сохраняется при компиляции с информацией об отладке.

В контекстах mamy смешной запрос хочет напечатать имя переменной, но если вам действительно нужно это сделать, прочитайте информацию об отладке java.

Ответ 5

Обходной путь. Если вы хотите имя объекта, то вы можете инициализировать его в конструкторе.

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

Ответ 6

Я предполагаю, что вам нужен способ "распечатать" объект, и в этом случае вы сначала захотите переопределить метод toString() для вашего объекта. Это позволит вам указать, что возвращает объект вашего типа, когда вы вызываете toString().

Затем вы можете просто сделать System.out.println(MyObject);

Это косвенно вызовет MyObject toString().

Ответ 7

Вы не можете получить имя ссылки на объект. Вместо этого вы можете получить свой хэш-код или счетчик. Я решаю эту проблему следующим образом:

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

Ответ 8

Это позволяет получить требуемый результат, но это немного выдумка, поскольку если строка, возвращаемая функцией 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);
    }

}

Ответ 9

Попробуйте отражение + хэш-код. Например:

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