【问题标题】:android - Pass class as parameter to access static variablesandroid - 将类作为参数传递以访问静态变量
【发布时间】:2012-10-18 13:08:48
【问题描述】:

我需要传递一个类,以便访问它的静态变量。 示例:

Class FirstClass
{
static int x = 1;
}
Class SecondClass
{
static int x = 2;
}

我在另一个类中有一个方法(FirstClass 和 SecondClass 都将使用该方法),但它需要访问静态变量,这是带有逻辑的伪代码:

public static void process(Class anyClass){
    anyClass.x;
}

【问题讨论】:

    标签: android class static-methods


    【解决方案1】:

    您可以使用反射访问该类的成员:

    Field f = anyClass.getDeclaredField("x");
    int xValue = f.getInt(null);
    

    通过将null 作为实例参数传递给getInt(),可以通过反射访问静态字段。

    我们使用getDeclaredField 是因为您想访问非公共字段。这样做的缺点是,如果您正在查看的类中不存在该字段,它会抛出一个InvalidFieldException,即使它在超类中定义的。但是,当然,如果它被定义在一个超类中,它将具有公共或受保护的访问权限,getField 也可以正常工作。

    【讨论】:

    • 这看起来不错,不幸的是,尽管该静态字段确实存在,但它却抛出了 NoSuchFieldException。
    • 对,对不起。由于getField 仅适用于可公开访问的字段。您需要将字段设置为公共(或受保护,如果访问者在同一类中),或者改用getDeclaredField
    【解决方案2】:

    如果您需要确定在运行时访问哪个类,并且您有多个具有相似命名变量的类,则可以使用 Class.forName() 以字符串形式返回给定类名的类的实例。

    http://developer.android.com/reference/java/lang/Class.html#forName(java.lang.String, boolean, java.lang.ClassLoader)

    public static void process(String className){
         classInstance = Class.forName(className);
    }
    

    您还需要知道类类型(以便您可以正确声明或强制转换 classInstance)。最简单的方法是让我们所有的“anyClass”类型都继承自一个公共超类。

    class AnyClassType1 extends AnyClass
    class AnyClassType2 extends AnyClass
    

    然后强制转换或声明classInstance:

    AnyClass classInstance;
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      相关资源
      最近更新 更多