【问题标题】:java reflection - how to get the name of a specific propertyjava反射-如何获取特定属性的名称
【发布时间】:2012-09-01 08:08:01
【问题描述】:

我有一个关于 java 反射的问题。

我需要某种方法来获取 java 类中特定字段的名称。像这样工作的东西:

class X{
   int x;

   String getNameOfProperty(Object o){
         ....
   } 
}

那么,调用时

System.out.println(getNameOfProperty(x));

我想得到“x”;

我已经设法使用

获取类的字段
X.class.getDeclaredFields();

但是我在属性和与之关联的 Field 对象之间没有任何链接。

【问题讨论】:

  • 是否需要获取某个字段的运行时值?
  • 你用过PropertyUtils吗?
  • 应用的用户功能是什么。需要实施吗?向我解释一下,就好像我是一个没有技术的潜在最终用户一样。知识。这样做可能会带来更好的建议。
  • 我有一个包含大量属性的上下文类。用户使用构建器填充其中的一些以自定义功能的行为。必须填充其中一些属性。我想检查它们是否为空,如果其中一些是这样,则抛出异常。我希望异常消息包含属性的名称,以便用户可以检查她的代码并查看她忽略分配的属性。我不想在消息中硬编码名称。

标签: java class reflection properties


【解决方案1】:

您可以为此目的使用抽象语法树。对于 Eclipse,您可以找到详细信息 here

你也可以使用以下

-ANTLR

-javaparser

【讨论】:

  • 是的,这绝对是一种方法,但我是 AST 的新手,它们对于我需要的东西来说似乎太复杂了。我的意思是,我没有太多时间在这方面进行投资……不过,这是一个很好的答案。 +1
【解决方案2】:

这里真的不清楚你想问什么。

如果我正确理解了您的问题,Field java 中的类允许您在运行时获取该字段的对象值。 getDeclaredFields 回复你Field[]

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/Field.html

检查get(Object o)方法

返回指定对象上此字段表示的字段的值。如果该值具有原始类型,则该值会自动包装在对象中。

【讨论】:

    【解决方案3】:

    我认为您可以在 java.lang.reflect.Field 类中使用 getName()。您的问题中的代码中已经包含了很多字段

    在 core.Test1 类中考虑这段代码。对 fieldName 的调用将返回 'i' 和 'd' 以及 42 和 6。(不是我在这里使用 getDouble 并且 int 适合 Dboule ,所以没有问题。您可能需要检查您要查找的字段的类型获取 first 的值。)

    这就是你所追求的吗?

    private int i = 42;
    private double d = 6.0d;
    
    @Test
    public void test() {
        try {
            Class<?> clazz = Class.forName("core.Test1");
    
            Field[] fieldlist = clazz.getDeclaredFields();
            for (int i  = 0; i < fieldlist.length; i++) {
               System.out.println("field name = " + fieldlist[i].getName());
               System.out.println("value = " + fieldlist[i].getDouble(this));
               System.out.println("field type  = " + fieldlist[i].getType());
               System.out.println("modifiers = " +  Modifier.toString(fieldlist[i].getModifiers()));
            }
          }
          catch (Throwable e) {
             System.err.println(e);
          }
    }           
    

    【讨论】:

    • 同意,但我怎么知道在运行时 fieldlist[i] 是我的属性 x 的抽象?它可能是我可能拥有的一些其他属性的抽象,比如 y。我需要这个链接。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2010-11-15
    • 2011-04-23
    • 2010-10-19
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多