如何从非静态场/变量中区分对象与静态场和对象

时间:2013-12-17 09:54:08

标签: java reflection

class A {
  static A STATIC_A = new A();
  A() {}
}

boolean isComingFromStaticField(Object a) {
  // returns true if a comes from static field, for example A.STATIC_A
  // returns false if a comes from non-static field/variable, for example new A()
  // .. or vice versa ...
}

在Java反射中,了解静态字段中的对象与“普通”字段/变量之间的区别的方法是什么?

2 个答案:

答案 0 :(得分:4)

没有“静态实例”和“普通实例”这样的东西。只有静态变量(和方法等)。例如:

public class Foo {
    static Object bar = new Object();
    Object baz = bar;
}

这里bazbar的值引用同一个对象 - 尽管一个变量是静态的,一个是实例变量。

现在,如果只是想要检查特定引用是否等于A.STATIC_INSTANCE,那么这是一个简单的引用相等性检查:

boolean isStaticInstance(Object a) {
    return a == A.STATIC_INSTANCE;
}

...但请注意,检查的所有是引用相等。在你自己的脑海中澄清你的真实含义后,你应该避免使用像“静态实例”这样的误导性术语。

答案 1 :(得分:4)

实例(在您的示例中为A类)只是一个实例,某些类B中的静态变量可能指向它,但C类中的另一个非静态变量也可能指向它。所以你不能进行这项检查,因为它没有意义。