[英]Java Reflection: GetDeclaredFields() method call in inherited class from super class
我有一堆传感器,应该从超类继承。
在我的超类以及传感器本身中,有静态的最终属性以及属性的可能值范围,这些属性定义了传感器。
现在,我想提供一个方法,该方法返回属性的HashMap
及其在超类中的值范围。
由于这一事实,即传感器永远不会更改其参数,因此我想将此getAttributes()方法用作类方法,以便在main []中进行可选调用。
我的问题是:如何以静态方式获取属性(目前我使用了反射)很好。
我说的UML图:
我的主要方法如下:
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现在说:“不能在静态上下文中使用它。” 但是,如何纠正此错误?
一方面,删除静态标签可以解决问题,但是另一方面,我必须实例化每个传感器,然后才能获取属性信息。
您正在使用关键字“ this”,它引用静态方法中该对象的实例。 不对
为了完成相同的任务,请改用以下代码:
Field[] fields = Class.forName("my.package.MyClass").getDeclaredFields();
如果传递要检索其字段的类作为方法的参数,则可以静态执行此操作。
否则,您只能为您所在的班级做这件事,因为您已经知道所有声明的字段,所以这样做达不到目的。
静态方法不会被继承,因此您不能在子类上神奇地调用它(为此,您确实需要删除static
修饰符)。
因此,执行以下操作可能会达到您想要的目标:
public static HashMap<String, List<String>> getConfigurationAttributes(boolean getMandatoryOnly, Class c)
{
Field[] classAttributes = c.getDeclaredFields();
// ... other code, working with the attributes.
}
编辑:现在关于反射的强制性警告:像这样使用反射不是一个很好的解决方案。 反射是昂贵的,它围绕许多语言功能工作,而不是一种非常干净的实现方式。 请尽可能避免反射,在大多数情况下,这里提供简单,优雅且更容易的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.