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

У меня есть функция 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 ответов

Решение

Учтите, что параметр не мог быть переменной (и поэтому не имел бы имени):

testForNull(x != y);

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

Да, но я бы не рекомендовал это, и это было бы исключительно сложно. Пытаться 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()

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

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

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

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

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

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

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

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

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

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

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

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

Родни

Другие вопросы по тегам