2013-12-20 119 views
0

我有一堆传感器,应该从超类继承。Java反射:从超类的继承类调用GetDeclaredFields()方法

在我的超类以及传感器本身中,存在静态的最终属性和我的属性的可能值范围,它们定义了我的传感器。

现在我想找出一个方法,该方法在超类中返回属性及其值范围的HashMap

由于事实上,传感器永远不会改变它的参数,我想用这个getAttributes()方法作为一个类方法,可选地在我的main []中调用它。

我的问题是:如何以静态方式获得属性(我此时使用了反射)如此好。我说的

UML图:
Here

我的主要方法是这样的:

public static void main(String[] args){ 
    HashMap<String, List<String>> a = SensorA.getConfigurationAttributes(); 
} 

和我的抽象组件类:

public static HashMap<String, List<String>> getConfigurationAttributes(boolean getMandatoryOnly){ 
    Field[] classAttributes = this.getClass().getDeclaredFields(); // error: cannot use this in static context 
    // ... other code, working with the attributes. 
} 

当然,现在, Java说:“不能在静态上下文中使用它。”但是,我该如何纠正这个错误?

一方面,删除静态标签将解决问题,另一方面,我必须在获取我的属性信息之前实例化每个传感器。

回答

0

,如果你沿着您要检索的字段作为参数传递给你的方法的类传给你可以做到这一点静态。

否则,你只能为你所在的班级做,因为你已经知道所有声明的领域,哪种打败的目的。

静态方法不是继承的,所以你不能在子类上神奇地调用它(因为你确实需要删除static修饰符)。

因此,做这样的事情,也许达到你想要什么:

public static HashMap<String, List<String>> getConfigurationAttributes(boolean getMandatoryOnly, Class c) 
{ 
    Field[] classAttributes = c.getDeclaredFields(); 
    // ... other code, working with the attributes. 
} 

编辑:现在的强制性警告有关反射:使用反射像,这不是一个很好的或优雅的解决方案。反思代价昂贵,围绕着许多语言特性工作,而不是一种非常干净的实现方式。尽可能避免反思,在大多数情况下,有简单,优雅和简单的解决方案。

0

您正在使用关键字“this”,它在静态方法内引用该对象的实例。 这是不正确的。

为了达到同样的任务,使用此代码来代替:

Field[] fields = Class.forName("my.package.MyClass").getDeclaredFields();