所以我在处理程序中的首选项时遇到了一点问题。考虑到它将被使用的次数,使用单一方法是最好的。每个变量的getter可能会导致文件变大。
(5个字段* 200到300个类=大量浪费的空间)
我试图弄清楚如何从子类访问具有定义和常量名称的字段。
超类是抽象的,定义在一个列表中,我可以完全访问它。在这个类中,我想要字段的getter
我希望它的工作方式是这样的:
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
我(到目前为止)看到这是可能的:
- 反射
- 使用Getter - 希望避免 使用注释
使用注释是我认为可能的一种方式,但我通常不喜欢它们的整体概念,但如果这是唯一的方法,我当然会接受它。
谢谢你的阅读,希望你能提供一些见解。
您是否可以更详细地描述您的高级问题,因为听起来您可能需要进行一些设计更改来缓解这个问题。一般来说,通过反射从父类中访问子类的字段似乎是一个坏主意。
然而,话虽如此,你需要使用getDeclaredField
而不是getField
来通过反射访问私有字段。
。
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;
}
}
您可以使用Map,像这样:
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");
}
}