Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to get the declaration name of an object at runtime in java?

Lets say i have a a button somewhere in the code: "JButton closeButton". I dont know that it's called "closeButton" but that's what i want to find out.

At runtime, that button gets clicked and once it does i can find out a lot about it through reflection and the AWT api - BUT what i can't do is find out where it is - how it's called in the code, what name is it declared as ("closeButton").

Is it possible to find this out from the JVM?

Is there a way to compile and run the code in such a way that the names for the instances get preserved at runtime?

Is there perhaps some type of 'javaagent' out there (free if possible) that can help me out in this situation?

Thanks

EDIT (14:23 EDT):

I am using a button as an example but it could be any type of component that can hold a value and have ActionListeners attached to it. I can obtain every bit of information via reflection about that component but i cant find it in the code. Even if there are 10 components that have been declared with the same name, that still gives me a lead, i can eliminate possibilities.

like image 810
LoudNPossiblyWrong Avatar asked Jan 31 '11 19:01

LoudNPossiblyWrong


2 Answers


import java.lang.reflect.*;

public class field1 { private double d; public static final int i = 37; String s = "testing";

  public static void main(String args[])
  {
     try {
        Class cls = Class.forName("field1");

        Field fieldlist[] 
          = cls.getDeclaredFields();
        for (int i 
          = 0; i < fieldlist.length; i++) {
           Field fld = fieldlist[i];
           System.out.println("name
              = " + fld.getName());
           System.out.println("decl class = " +
                       fld.getDeclaringClass());
           System.out.println("type
              = " + fld.getType());
           int mod = fld.getModifiers();
           System.out.println("modifiers = " +
                      Modifier.toString(mod));
           System.out.println("-----");
        }
      }
      catch (Throwable e) {
         System.err.println(e);
      }
   }

}

This should give you a list of all the fields of the class.

like image 62
Jesus Ramos Avatar answered Sep 19 '22 23:09

Jesus Ramos


If your "variable" is a field, then the solution using reflection (mentioned in another answer) works.

If your variable is a local variable, you can in theory use a JVMTI agent to get its name, provided that you compiled your class with debug info. And that your local variable is in scope when you check. And that nobody changed its value and there's no other variable with the same value (in which case you couldn't decide which is the one you need).

However, you should absolutely not do any of them. They are theoretical possibilities, akin to punching yourself so hard that you pass out.

like image 36
biziclop Avatar answered Sep 21 '22 23:09

biziclop