通过反射,如何获得子类继承自父类的属性

通过反射,如何获得子类继承自父类的属性,第1张

你是想通过反射获得该类所有属性值或是给所有属性赋值吧。用getMethods获取所有的getter和setter方法,再取值或赋值。但不要用getDeclaredMethods,因为getMethods反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法;而getDeclaredMethods反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

这也许是框架注入属性值都采用setter注入的原因吧。

这是一个很值得探讨的问题,许多人接触反射时,对反射功能之强大都会抱有怀疑,感觉严重破坏了封装的性质。可是,什么是封装,什么是安全呢?

封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。

所谓安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。

所以我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。就好比核技术,虽然造核d很危险吧,但造核电站还是很有用处的(这个比喻似乎不是很恰当,将就将就)。

曾经给朋友讨论过这个问题,感觉解释得不是很清楚,大家一起探讨探讨,看看怎样表述才能更容易理解:)

private属性是私有的,在子类是无法访问的。如果必须要访问,可以采用反射的方法,获取父类的class,然后拿到field,再然后setAccessible=true来进行访问。

父类的私有属性和方法是不被子类继承调用的,如果你非要这么做可以

1、在父类中另外定义protected 的方法 *** 作私有方法,子类调用该方法

2、将私有方法改为protected

3、使用反射,获取父类所有方法,根据名称调用

背景介绍:在一个Bean类中,需要通过反射机制获得private字段属性时,如果用通常获得步骤获得会报如下错误:javalangIllegalAccessException: Class Test can not access a member of class Bean with modifiers "private"at sunreflectReflectionensureMemberAccess(Reflectionjava:57)at javalangreflectFielddoSecurityCheck(Fieldjava:811)at javalangreflectFieldgetFieldAccessor(Fieldjava:758)at javalangreflectFieldget(Fieldjava:228)解决如下代码实现代码:1Beanclass内容如下:public class Bean {private String aa;}2Testclass内容如下:public class Test {public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {Bean test = new Bean();Field f = BeanclassgetDeclaredField("aa");//其中,最关键的代码是://fsetAccessible(true);//这行代码把对象data上的name字段设置为public访问属性fsetAccessible(true);Systemoutprintln(fget(test));Systemoutprintln(fget(test));}}运行Test类输出如下:nullt2

反射不是通过get取值的,是通过该对象的信息,比如说名称、内存地址等来访问类,方法,属性等,可以获取任意对象的信息,但不能获得私有属性(private String s=“sd”;)的值,切记

推荐《JAVA核心技术》这本书会对你有帮助的

以上就是关于通过反射,如何获得子类继承自父类的属性全部的内容,包括:通过反射,如何获得子类继承自父类的属性、java反射机制可以调用到私有方法,是不是就破坏了JAVA的卦装性呢。、java private私有属性怎么在子类中访问等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10161970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存