Java 从类访问静态字段<;A>;变量

Java 从类访问静态字段<;A>;变量,java,class,static,Java,Class,Static,我有以下情况(我知道这听起来不真实,但为了更好地理解,我简化了它): AA类,带有公共静态int f已声明 其他类别B、C、D、扩展一个 具有以下签名的方法foo(在其他地方无所谓):intfoo(Classclassz) 现在,我希望这个方法实现从classz表示的类返回静态字段f的值;A的子类可能具有不同的值。我不想使用反射(以及新的jdk7 invoke.*特性)。目前,我有一个可行的解决方案,但并不好,因为它实例化了一个对象(这应该不是必需的),并通过从实例访问静态字段生成警告: i

我有以下情况(我知道这听起来不真实,但为了更好地理解,我简化了它):

  • A
    A类
    ,带有
    公共静态int f已声明
  • 其他类别<代码>B、C、D、扩展一个
  • 具有以下签名的方法
    foo
    (在其他地方无所谓):
    intfoo(Classclassz)
现在,我希望这个方法实现从
classz
表示的类返回静态字段
f
的值;
A
的子类可能具有不同的值。我不想使用反射(以及新的jdk7 invoke.*特性)。目前,我有一个可行的解决方案,但并不好,因为它实例化了一个对象(这应该不是必需的),并通过从实例访问静态字段生成警告:

int foo(Class< A> classz) throws [don't matter] {
    return classz.newInstance().f;
}
intfoo(Classclassz)抛出[没关系]{
返回classz.newInstance().f;
}
有什么建议吗? 提前谢谢


PS:不知道如何在没有空格的情况下键入
类<?>

不太清楚你想做什么,或者你为什么要传入一个类-看起来你只需要:

int foo() {
    return A.f;
}
一旦成功,您当前的代码无论如何都会返回这个结果。您的代码相当于:

int foo(Class<A> classz) throws ... {
    A ignored = classz.newInstance();
    return A.f;
}
intfoo(类z)抛出。。。{
A忽略=classz.newInstance();
返回A.f;
}

这听起来像是在尝试将多态性与静态字段结合使用——这根本行不通。静态成员和字段都不是多态的。如果要在每个子类中声明额外的
f
字段,则必须使用反射来获取它们,但我建议您无论如何都要重新设计。如果您没有在每个子类中声明额外的
f
字段,那么无论如何您只有一个字段-
B.f
C.f
基本上将解析为
A.f

问题是类B、C、D可以在f上有不同的值。我发布的解决方案的工作原理是,它具有这种“静态字段多态性”;我的意思是,当你从一个实例访问一个静态字段时,它有这个“多态性”。。。(好吧,mayble我会尝试javap我的解决方案,看看它是如何在字节码级别完成的)@FakeFaker:不,它们不能有不同的
f
值,除非它们声明自己的变量-在这种情况下,你基本上是在跟踪。这不是一个好的设计,你需要使用反射。不,它没有这种多态性。例如:
aaa=newb();int x=a.f
将始终使用
A.f
,而不是
B.f
。如果你能澄清你是否真的在子类中声明了
f
,这会很有用,因为如果你没有,你只有一个变量,我怀疑你是自欺欺人地认为每个子类都有一个变量。嗯……不,我没有在子类中声明它,我确实自欺欺人地认为每个子类都有一个变量:)那太愚蠢了,我会试着重新思考我的整个问题。。谢谢