Is there a way in Java to find the name of the var

2019-04-18 18:29发布

问题:

I have a Java function called testForNull

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

I use it to test multiple objects to ensure they are not null. But, I am unable to tell the name of the variable that way.

For eg. if I say

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

I cannot tell which of the three lines caused the "Object is null" output. Of course, I can simply add another parameter to the function and have something like

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

But I want to know whether it is possible to deduce the name of the variable without passing it explicitly. Thanks.

回答1:

Consider that the parameter might not have been a variable (and therefore wouldn't have a name):

testForNull(x != y);


回答2:

No, there is no such a way. You will have to explicitly pass the name of the variable. However, if your object has a field 'name' or displays its name via the toString() function, then that might help you.



回答3:

This is what a debugger is for. There is no way to do this programmatically. What if I invoke testForNull(1 + 1). What is the variable name then?

Eclipse has a graphical and easy-to-use debugger for Java built-in. Learning how to use that will pay dividends in the long run, and happens to be the immediate solution to your problem as well.



回答4:

you could place the method call in a foreach and set a reference ID for each object that you are going through, even if it returns null or not null for that specific object.



回答5:

Yes, but I wouldn't recommend it and it would be exceptionally hard. Try assert instead:

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

To do what you want, if you have the source code, get the current thread http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

Get a stack trace http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

Get the 2nd to last element, the class name, file name, and line number, then print that line, or parse it http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary



回答6:

Bah, After looking at the original question again, this is a non-starter.

The question asks us to be able to provide a means by which a value passed into a CheckForNull() method can retrieve the values name - and here's the kicker... only when the value is null.

There is absolutely no way you are going to get anything from a null value other than a String containing "null" or a NullPointerException.

But, as usual, object orientation to the rescue. Create a value class like I mentioned above. Now add an isNull() method to it. Use this value class for any value you are wanting to dump debugging text for.



回答7:

Java is an object oriented language, therefore the answer is "most definitely!" you can tell the name of the variable passed as a parameter. To do so, try this...

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

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

Now in your methods, you would accept all parameters as instances of Value, as in the following method which would accept only Values created with classes having Number as a base class (which would be Long, Float, Double, etc)...

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

And that is all there is to it! I use a generic class so that Value can be used to pass in any type - Floats, Longs, Double, BigInteger, String - for example...

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

Also, the method above is simply an example - in practice any method accepting a Value could access its name.

Good Luck and may all your code compile flawlessly!

Rodney



标签: java metadata