【问题标题】:How to find out if a class member is static and a field in Java如何找出类成员是否是静态的以及Java中的字段
【发布时间】:2015-01-30 03:46:49
【问题描述】:

如何判断一个类的成员是静态的还是字段的? 我尝试使用 .getModifiers() 方法,但没有返回所需的结果。

  • bc 会员:
    • 成员标识符
    • 包含此成员的类的标识符
    • 布尔值:如果成员是静态的,则为 true,否则为 false
    • 布尔值:如果成员是字段则为真;否则为假
    • 成员(返回)类型的限定名称
    • 数组限定符:' ' 表示返回类型不是数组,'[ ]' 是一维数组,'[ ][ ]' 是二维数组,依此类推。
    • 成员签名:对于一个字段,它是该字段的名称。对于方法,它是方法的名称,后跟其参数列表。

yparser.connection 包的期望输出是:

bcClass(c0,'yparser.connection','Object').

/* public Constructors */
bcMember(m0,c0,true,false,'yparser.connection','','connection(String,String,String,String,String,String)').

/* public Fields */
bcMember(m1,c0,true,true,'String','','quote').
bcMember(m2,c0,true,true,'String','','comma').
bcMember(m3,c0,false,true,'String','','name1').
bcMember(m4,c0,false,true,'String','','role1').
bcMember(m5,c0,false,true,'String','','end1').
bcMember(m6,c0,false,true,'String','','name2').
bcMember(m7,c0,false,true,'String','','role2').
bcMember(m8,c0,false,true,'String','','end2').

/* public Methods */
bcMember(m9,c0,true,false,'void','','dump()').

【问题讨论】:

  • 您有一个方法、一个字段或一个类。没有通用的 Member 超类型。
  • 那么它返回了什么结果呢?你期待什么?
  • 对不起,我说的成员是字段和方法(构造函数也是方法吗?
  • 我输入了这个: Modifier.isStatic(cons.getModifiers()) 其中 cons 是从 .getDeclaredConstructors() 返回的类的声明构造函数,它返回 false,当正确的输出应该是一个针对我正在测试的特定案例。
  • 构造函数从什么时候开始是静态的?

标签: java reflection


【解决方案1】:

您知道它是一个字段,因为它是一个 Field 对象。

判断是否为静态:

if(Modifier.isStatic(f.getModifiers()))
    System.out.println("Field is static!");

if((f.getModifiers() & Modifier.STATIC) != 0)
    System.out.println("Field is static!");

【讨论】:

  • 那怎么看是不是Field对象呢?
  • @PresidentNick 因为你在某个时候写了Field f;。 (如果你只有一个Object 引用,那么你使用instanceof。同样的方式你会告诉一个对象是否是一个String
  • @PresidentNick 这个问题没有意义。在已经知道是字段还是方法的情况下,您无法获得类成员反射对象。因为这就是你所要求的:一个或另一个。强类型也会告诉你。如果出于某种未知原因您将结果存储在 Object 中,您仍然可以使用 instanceof 来消除歧义。
  • 那么,如果你有构造函数,你为什么要问它们是否是字段?这没有任何意义。如果您不知道构造函数和字段之间的区别,那么您在使用反射时还为时过早。
  • "我刚拨了一个电话号码,我怎么知道我是打给老板还是打给老婆?"
【解决方案2】:
fields[] fld= TheClass.class.getDeclaredFields();
for (Field fldd : fld) {
    if (java.lang.reflect.Modifier.isStatic(fldd.getModifiers())) {
        //Then the fldd is static
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多