在Java中有没有办法找到传递给函数的变量的名称?

时间:2012-04-02 22:10:49

标签: java metadata

我有一个名为testForNull的Java函数

   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 个答案:

答案 0 :(得分:15)

考虑参数可能不是变量(因此没有名称):

testForNull(x != y);

答案 1 :(得分:5)

不,没有这样的方法。您必须显式传递变量的名称。 但是,如果您的对象有一个字段'name'或通过toString()函数显示其名称,那么这可能对您有帮助。

答案 2 :(得分:1)

这是调试器的用途。没有办法以编程方式执行此操作。如果我调用testForNull(1 + 1)怎么办?那么变量名是什么?

Eclipse有一个图形化且易于使用的Java内置调试器。从长远来看,学习如何使用它将带来红利,并且恰好是你问题的直接解决方案。

答案 3 :(得分:0)

您可以将方法调用放在foreach中,并为您要经历的每个对象设置引用ID,即使它为该特定对象返回null或不为null。

答案 4 :(得分:0)

是的,但我不会推荐它,这将非常困难。请尝试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()

获取倒数第二个元素,类名,文件名和行号,然后打印该行,或者解析它http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

答案 5 :(得分:0)

Bah,再次查看原始问题后,这是一个非首发。

这个问题要求我们能够提供一种方法,通过这种方法,传递给CheckForNull()方法的值可以检索值名称 - 这里只有当值为空时才是踢球者....

除了包含“null”或NullPointerException的String之外,绝对没有办法从null值中获取任何内容。

但是,像往常一样,面向救援的对象。创建一个像我上面提到的值类。现在为它添加一个isNull()方法。将此值类用于要为其转储调试​​文本的任何值。

答案 6 :(得分:-3)

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

此外,上述方法只是一个示例 - 实际上,任何接受Value的方法都可以访问其名称。

祝您好运,并且您的所有代码都可以完美编译!

罗德尼