运行结果如下:
反射还可以获取private修饰的属性和方法,在反射面前类就像没有穿衣服一样。
当然,凡事有利就有弊,然后我们再来说一下java反射的优缺点;
优点:
1:能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性;
2:与java动态编译相结合,可以实现无比强大的功能。
缺点:
1:使用反射的性能较低;
2:使用反射来说相对不安全;
3:破坏了类的封装性,可以通过反射来获取这个类的属性,和私有方法。
A:1、Java的private修饰符不是为了绝对安全设计的,而是对用户常规使用Java的一种约束。就好比饭店厨房门口挂着“闲人免进”的牌子,但是你还是能够通过其他方法进去。
2、从外部对对象进行常规调用时,能够看到清晰的类结构
反射不是通过get取值的,是通过该对象的信息,比如说名称、内存地址等来访问类,方法,属性等,可以获取任意对象的信息,但不能获得私有属性(private String s=“sd”;)的值,切记 推荐《JAVA核心技术》这本书会对你有帮助的
反射可以获取到属性类型,Field类里面有个方法,getType()就是获取属性类型的
下面是个示例代码
public static void main(String args[]) {
\x09\x09People peo = new People();
\x09\x09Class cla = Peopleclass;
\x09\x09try {
\x09\x09\x09Field[] fields = clagetFields();
\x09\x09\x09for(Field field:fields){
\x09\x09\x09\x09Class c = fieldgetType();
\x09\x09\x09\x09if(c==Stringclass){
\x09\x09\x09\x09\x09fieldset(peo,"EMPTY");
\x09\x09\x09\x09}else if(c==Integerclass){
\x09\x09\x09\x09\x09fieldset(peo,0);
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09} catch (SecurityException e) {
\x09\x09\x09// TODO Auto-generated catch block
\x09\x09\x09eprintStackTrace();
\x09\x09}catch (IllegalArgumentException e) {
\x09\x09\x09// TODO Auto-generated catch block
\x09\x09\x09eprintStackTrace();
\x09\x09} catch (IllegalAccessException e) {
\x09\x09\x09// TODO Auto-generated catch block
\x09\x09\x09eprintStackTrace();
\x09\x09}
\x09}
主要就是用Class c = fieldgetType();
这个来获取类型
仍有问题可以Hi我或者直接追问
父类的私有属性和方法是不被子类继承调用的,如果你非要这么做可以
1、在父类中另外定义protected
的方法 *** 作私有方法,子类调用该方法
2、将私有方法改为protected
3、使用反射,获取父类所有方法,根据名称调用
D
A
B
A
D
A
A
C
A
B
你是想通过反射获得该类所有属性值或是给所有属性赋值吧。用getMethods获取所有的getter和setter方法,再取值或赋值。但不要用getDeclaredMethods,因为getMethods反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法;而getDeclaredMethods反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
这也许是框架注入属性值都采用setter注入的原因吧。
以上就是关于通过反射修改不可变的String类全部的内容,包括:通过反射修改不可变的String类、为什么反射type.GetFields 取不到任何值、JAVA中重写父类方法后,这个方法如何调用父类私有属性方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)