如何在Java中从此实例获取实例变量名称

时间:2019-03-25 17:49:10

标签: java reflection

有没有办法做这样的事情?

public class T {
    String var = "Some value";

    public void show() {
        System.out.println(var.getClass().getName()); // Prints var
    }
}

编辑

用例:我有一个类X,其中包含许多实例变量,这些变量将作为参数传递给另一个类Y的主入口点。 X类具有以下方法:

protected String[] getAttributesAsCommandLineArguments() {
    return new String[] {
        String.format("--%s=%s", "state", state),
        String.format("--%s=%s", "accountId", accountId),
        String.format("--%s=%s", "pageId", pageId),
        String.format("--%s=%s", "retroactiveDays", retroactiveDays),
        String.format("--%s=%s", "state", state),
        String.format("--%s=%s", "task", task),
        String.format("--%s=%s", "channel", channel),
    };
  }

我不想为每一行String.format()都重复两个引用的字符串名称。

我想要这样的东西:

protected String[] getAttributesAsCommandLineArguments() {
    return new String[] {
        String.format("--%s=%s", state.getDeclaredName(), state),
        String.format("--%s=%s", accountId.getDeclaredName(), accountId),
        String.format("--%s=%s", pageId.getDeclaredName(), pageId),
        String.format("--%s=%s", retroactiveDays.getDeclaredName(), retroactiveDays),
        String.format("--%s=%s", state.getDeclaredName(), state),
        String.format("--%s=%s", task.getDeclaredName(), task),
        String.format("--%s=%s", channel.getDeclaredName(), channel),
    };
  }

1 个答案:

答案 0 :(得分:-1)

尝试一下。

import java.lang.reflect.Field;

public class T {

public String var = "Some Value"; 
String var2 = "Some Another Value";

public void printFields(Object obj) throws Exception {
    Class<?> objClass = obj.getClass();
    Field[] allFields = objClass.getDeclaredFields(); 
    for(Field field : allFields) {
        String name = field.getName(); // variable name
        Object value = field.get(obj); // OP doesn't need this though
        System.out.println(name + ":" + value.toString());
    }

}

public static void main(String[] args) {
    T ob = new T();
    try {
        ob.printFields(ob);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }
}

输出:

var:Some Value

var2:Some Another Value

有用的资源:- https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredFields()