繁体   English   中英

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

[英]Is there a way in Java to find the name of the variable that was passed to a function?

我有一个名为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");

但是我想知道是否可以在不明确传递变量的情况下推断出变量的名称。 谢谢。

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

testForNull(x != y);

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

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

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

呸,再看一下原来的问题,这是一个非首发。

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

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

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

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

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

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的方法都可以访问其名称。

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

罗德尼

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM