Есть ли способ в 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);
Кроме того, приведенный выше метод является просто примером - на практике любой метод, принимающий значение, может получить доступ к его имени.
Удачи и пусть весь ваш код скомпилируется без нареканий!
Родни