Есть ли способ в Java, чтобы найти имя переменной, которая была передана в функцию? - PullRequest
15 голосов
/ 03 апреля 2012

У меня есть функция Java под названием testForNull

   public static void testForNull(Object obj)
    {
     if (obj == null)
      {
        System.out.println("Object is null");
      }
    }

Я использую его для тестирования нескольких объектов, чтобы убедиться, что они не равны нулю. Но я не могу сказать имя переменной таким образом.

Например. если я скажу

    testForNull(x);
    testForNull(y);
    testForNull(z);

Я не могу сказать, какая из трех строк вызвала вывод «Object is null». Конечно, я могу просто добавить другой параметр в функцию и получить что-то вроде

    testForNull(x, "x");
    testForNull(y, "y");
    testForNull(z, "z");

Но я хочу знать, возможно ли вывести имя переменной, не передавая ее явно. Благодарю.

Ответы [ 7 ]

15 голосов
/ 03 апреля 2012

Учтите, что параметр, возможно, не был переменной (и, следовательно, не имел бы имени):

testForNull(x != y);
5 голосов
/ 03 апреля 2012

Нет, такого способа нет. Вам придется явно передать имя переменной. Однако, если ваш объект имеет поле «имя» или отображает свое имя с помощью функции toString(), это может вам помочь.

1 голос
/ 03 апреля 2012

Для этого и нужен отладчик.Нет способа сделать это программно.Что если я призову testForNull(1 + 1).Какое тогда имя переменной?

Eclipse имеет встроенный графический и простой в использовании отладчик для Java.Изучение того, как его использовать, в долгосрочной перспективе принесет дивиденды, а также является непосредственным решением вашей проблемы.

0 голосов
/ 24 января 2013

Бах, еще раз посмотрев на оригинальный вопрос, это не стартер.

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

Нет абсолютно никакого способа получить что-либо из нулевого значения, кроме String, содержащего "null" или NullPointerException.

Но, как обычно, объект ориентирован на спасение.Создайте класс значений, как я упоминал выше.Теперь добавьте к нему метод isNull ().Используйте этот класс значений для любого значения, для которого вы хотите вывести отладочный текст.

0 голосов
/ 03 апреля 2012

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

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html

Чтобы сделать то, что вы хотите, если у вас есть исходный код, получите текущий поток http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

Получить трассировку стека http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

Получите от 2-го до последнего элемента, имя класса, имя файла и номер строки, затем напечатайте эту строку или проанализируйте ее http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

0 голосов
/ 03 апреля 2012

Java является объектно-ориентированным языком, поэтому ответ «определенно!» Вы можете сказать имя переменной, переданной в качестве параметра. Для этого попробуйте это ...

class Value<T> extends Object
{
    T value;
    String name;

    public Value(String name, T value)
    {
        this.name = name;
        this.value = value;
    }
}

Теперь в ваших методах вы будете принимать все параметры как экземпляры Value, как в следующем методе, который будет принимать только значения, созданные с классами, имеющими Number в качестве базового класса (такими как Long, Float, Double и т. Д.). ..

public String SomeMethodWantingToKnowParameterNames(Value<? extends Number> parm1)
{
    if (parm1 != null)
    {
        // Do your work with the parameter - it's name can be accessed via parm1.name
        // This is only an example
        // You would probably want to write an accessor for name
        return parm1.name;
    }

    // Return null for null
    return null;
}

И это все, что нужно! Я использую универсальный класс, чтобы Value можно было использовать для передачи любого типа - Floats, Longs, Double, BigInteger, String - например ...

Value<Float> vFloat = new Value<Float>("MyFloat", 0.0);

Кроме того, приведенный выше метод является просто примером - на практике любой метод, принимающий значение, может получить доступ к его имени.

Удачи, и пусть весь ваш код скомпилируется без ошибок!

Родня

0 голосов
/ 03 апреля 2012

Вы можете поместить вызов метода в foreach и установить ссылочный идентификатор для каждого объекта, который вы проходите, даже если он возвращает ноль или не ноль для этого конкретного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...