字段子类访问 - 最佳方式可能

时间:2013-03-15 18:32:32

标签: java reflection annotations field getter

所以我在处理程序中的首选项时遇到了一些问题。考虑到使用它的次数,使用单一方法是最好的。每个变量的getter可能会导致更大的文件。

(5个领域* 200到300个类=浪费大量空间)

我试图找出如何从子类访问具有已定义和常量名称的字段。

超类是抽象的,在列表中定义,我可以完全访问它。这是我想要场的吸气剂的类。

我希望它的工作方式是这样的:

import java.lang.reflect.Field;

public class Test {

    public Test() {
        final B b = new B();
        final C c = new C();
        System.out.println(b.getFoo());
        System.out.println(c.getFoo());
    }

    public static void main(String[] args) {
        new Test();
    }

    public class A {

        public String getFoo() {
            try {
                Field f = this.getClass().getField("FOO");
                f.setAccessible(true);
                return (String) f.get(null);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

    }

    public class B extends A {

        private static final String FOO = "$HOME.DIR/lib/res/image1.png";

    }

    public class C extends A {

        private static final String FOO = "$HOME.DIR/lib/res/image2.png";

    }

}

预计,这不起作用。类A不包含字段'FOO'。理想情况下,如果它有效,我会期望它打印出来:

  

$ HOME.DIR / LIB / RES / image1.png
  $ HOME.DIR / LIB / RES / image2.png

我的方式(到目前为止)看到这是可能的:

  1. 反射
  2. 使用Getter - 希望避免
  3. 使用注释
  4. 使用注释是我认为可行的一种方式,但我通常不喜欢它们的整体概念,但如果这是我当然接受它的唯一方式。

    感谢您阅读本文,希望您能提供见解。

2 个答案:

答案 0 :(得分:3)

您能否更详细地描述更高级别的问题,因为听起来您可能会进行一些设计更改以缓解此问题。通过反射访问子类的字段形成父类似乎一般都是个坏主意。

然而,话虽如此,您需要使用getDeclaredField代替getField才能通过反思访问私有字段。

E.g。

public String getFoo() {
        try {
            Field f = this.getClass().getDeclaredField("FOO");
            f.setAccessible(true);
            return (String) f.get(null);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
}

答案 1 :(得分:0)

您可以使用地图,如下所示:

import java.util.HashMap;
import java.util.Map;

public class Test 
{
    public Test() 
    {
        final B b = new B();
        final C c = new C();
        System.out.println(b.getFoo());
        System.out.println(c.getFoo());
    }

    public static void main(String[] args)
    {
        new Test();
    }
}

class A 
{
    private static final Map<String, String> values;

    static
    {
        values = new HashMap<String, String>();
    }

    public String getFoo() 
    {
        return (values.get("FOO"));
    }

    protected static void addValue(final String key,
                                  final String value)
    {
        values.put(key, value);
    }
}

class B extends A 
{
    static
    {
        addValue("FOO", "$HOME.DIR/lib/res/image1.png");
    }
}

class C extends A 
{
    static
    {
        addValue("FOO", "$HOME.DIR/lib/res/image2.png");
    }
}