代码测试:java反射中getXXX和getDeclaredXXX的区别
2016-03-18 19:26
417 查看
原创不易,转载请注明出处,水平有限,有错漏敬请指出!
直接说结论,大伙有时间再看代码
2.用getDeclaredXXX方法,类里面定义的所有字段或方法,不论是什么修饰符,都能取到。
但不能取父类的任何字段。
2.Java所有的类都继承了Object类,
所以,只要用了getXXX,就一定能取到Object类的public的方法.(Object类没有属性)
3.getDeclaredXXX能取到重写父类的方法
4.对于private的属性,有没有提供get,set方法跟用反射取值没关系,取不到就是取不到,提供了也没用。
的方法和属性各1个,并各定义了1个XXXPrivateFieldWithGetSet属性,提供get,set方法。Human类重写了
Object类的toString()方法。然后打印通过getXXX和getDeclaredXXX取到的值,比较得出结论。
直接说结论,大伙有时间再看代码
一、结论:
1.用getXXX方法,只能取到自己和父类的public的属性或方法,其他都取不到。2.用getDeclaredXXX方法,类里面定义的所有字段或方法,不论是什么修饰符,都能取到。
但不能取父类的任何字段。
二、注意:
1.Java是可以多级继承的,能取父类的public属性或方法,其实是能取它所有祖宗的public属性或方法的意思.2.Java所有的类都继承了Object类,
所以,只要用了getXXX,就一定能取到Object类的public的方法.(Object类没有属性)
3.getDeclaredXXX能取到重写父类的方法
4.对于private的属性,有没有提供get,set方法跟用反射取值没关系,取不到就是取不到,提供了也没用。
三、代码思路
定义了一个Human类和Boy类,Boy类继承Human类,两个类都定义了用public,protect,default,private修饰的方法和属性各1个,并各定义了1个XXXPrivateFieldWithGetSet属性,提供get,set方法。Human类重写了
Object类的toString()方法。然后打印通过getXXX和getDeclaredXXX取到的值,比较得出结论。
四、测试的源码
4.1 Human类
package com.cherrycheng.study.reflect.bean; /** * 人类 * 2016年3月18日 * @author chengru */ public class Human { /** Human类的public属性*/ public String humanPublicField; /** Human类的protected属性*/ protected int humanProtectedField; /** Human类的default属性*/ String humanDefaultField; /** Human类的private属性,提供getter,setter方法*/ private String humanPrivateFieldWithGetSet; /** Human类的private属性,无getter,setter方法*/ private String humanPrivateFieldNoGetSet; //----------------------- Override methods------------------------ @Override public String toString() { return ""; }; //----------------------- user-defined methods------------------------ public void humanPublicMethod(){ System.out.println("Human类的public方法"); } protected void humanProtectedMethod(){ System.out.println("Human类的protected方法"); } void humanDefaultMethod(){ System.out.println("Human类的default方法"); } private void humanPrivateMethod(){ System.out.println("Human类的private方法"); } //-----------------------gets and sets------------------------ public String getHumanPrivateFieldWithGetSet() { return humanPrivateFieldWithGetSet; } public void setHumanPrivateFieldWithGetSet(String humanPrivateFieldWithGetSet) { this.humanPrivateFieldWithGetSet = humanPrivateFieldWithGetSet; } }
4.2 Boy类
package com.cherrycheng.study.reflect.bean; /** * 男孩是人类的子类,继承人类的属性 * 2016年3月18日 * @author chengru */ public class Boy extends Human{ /** Boy类的public属性*/ public String boyPublicField; /** Boy类的protected属性*/ protected int boyProtectedField; /** Boy类的default属性*/ String boyDefaultField; /** Boy类的private属性,提供getter,setter方法*/ private String boyPrivateFieldWithGetSet; /** Boy类的private属性,无getter,setter方法*/ private String boyPrivateFieldNoGetSet; //----------------------- user-defined methods------------------------ public void boyPublicMethod(){ System.out.println("Boy类的public方法"); } protected void boyProtectedMethod(){ System.out.println("Boy类的protected方法"); } void boyDefaultMethod(){ System.out.println("Boy类的default方法"); } private void boyPrivateMethod(){ System.out.println("Boy类的private方法"); } //-----------------------getters and setters------------------------ public String getBoyPrivateFieldWithGetSet() { return boyPrivateFieldWithGetSet; } public void setBoyPrivateFieldWithGetSet(String boyPrivateFieldWithGetSet) { this.boyPrivateFieldWithGetSet = boyPrivateFieldWithGetSet; } }
4.3 测试类
package com.cherrycheng.study.reflect.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; import com.cherrycheng.study.reflect.bean.Boy; import com.cherrycheng.study.reflect.bean.Human; /** * 测试有继承和没继承的类使用反射的getXXX和getDeclaredXXX的区别<br/> * 2016年3月18日 * @author chengru */ public class DeclaredAndNot { private void printFields(Class<?> cl){ int i=1; System.out.println("------------"+cl.getName()+"'s Fields-----------"); for(Field f:cl.getFields()){ System.out.print(i+"、["+f.getName()+"] \t "); ++i; } System.out.println(); int j=1; System.out.println("------------"+cl.getName()+"'s DeclaredFields-----------"); for(Field f:cl.getDeclaredFields()){ System.out.print(j+"、["+f.getName()+"] \t "); ++j; } System.out.println(); System.out.println(); } private void printMethods(Class<?> cl){ int i=1; System.out.println("------------"+cl.getName()+"'s Methods-----------"); for(Method f:cl.getMethods()){ System.out.print(i+"、["+f.getName()+"] \t "); ++i; } System.out.println(); int j=1; System.out.println("------------"+cl.getName()+"'s DeclaredMethods-----------"); for(Method f:cl.getDeclaredMethods()){ System.out.print(j+"、["+f.getName()+"] \t "); ++j; } System.out.println(); System.out.println(); } /** * 测试继承的反射 * 2016年3月18日 * @author chengru */ @Test public void TestInheritReflect(){ printFields(Boy.class); printMethods(Boy.class); } /** * 测试对自身的反射 * 2016年3月18日 * @author chengru */ @Test public void TestSelfReflect(){ printFields(Human.class); printMethods(Human.class); } }
五 运行结果
------------com.cherrycheng.study.reflect.bean.Boy's Fields----------- 1、[boyPublicField] 2、[humanPublicField] ------------com.cherrycheng.study.reflect.bean.Boy's DeclaredFields----------- 1、[boyPublicField] 2、[boyProtectedField] 3、[boyDefaultField] 4、[boyPrivateFieldWithGetSet] 5、[boyPrivateFieldNoGetSet]
------------com.cherrycheng.study.reflect.bean.Boy's Methods----------- 1、[boyPublicMethod] 2、[getBoyPrivateFieldWithGetSet] 3、[setBoyPrivateFieldWithGetSet] 4、[toString] 5、[humanPublicMethod] 6、[setHumanPrivateFieldWithGetSet] 7、[getHumanPrivateFieldWithGetSet] 8、[wait] 9、[wait] 10、[wait] 11、[equals] 12、[hashCode] 13、[getClass] 14、[notify] 15、[notifyAll] ------------com.cherrycheng.study.reflect.bean.Boy's DeclaredMethods----------- 1、[boyPublicMethod] 2、[boyProtectedMethod] 3、[boyDefaultMethod] 4、[boyPrivateMethod] 5、[getBoyPrivateFieldWithGetSet] 6、[setBoyPrivateFieldWithGetSet]
------------com.cherrycheng.study.reflect.bean.Human's Fields----------- 1、[humanPublicField] ------------com.cherrycheng.study.reflect.bean.Human's DeclaredFields----------- 1、[humanPublicField] 2、[humanProtectedField] 3、[humanDefaultField] 4、[humanPrivateFieldWithGetSet] 5、[humanPrivateFieldNoGetSet]
------------com.cherrycheng.study.reflect.bean.Human's Methods----------- 1、[toString] 2、[humanPublicMethod] 3、[setHumanPrivateFieldWithGetSet] 4、[getHumanPrivateFieldWithGetSet] 5、[wait] 6、[wait] 7、[wait] 8、[equals] 9、[hashCode] 10、[getClass] 11、[notify] 12、[notifyAll] ------------com.cherrycheng.study.reflect.bean.Human's DeclaredMethods----------- 1、[toString] 2、[humanPublicMethod] 3、[humanProtectedMethod] 4、[humanDefaultMethod] 5、[humanPrivateMethod] 6、[setHumanPrivateFieldWithGetSet] 7、[getHumanPrivateFieldWithGetSet]
相关文章推荐
- 用java打暴雪星际争霸(2)——运行测试机器人
- java客户端和c服务端通信(JNI+UDP)
- Java 第二次作业
- Java实现文件的预览
- Spring Framework Reference Documentation(1)
- Spring Framework Reference Documentation(2)
- 《Java高级程序设计》第二周作业
- java第二次作业
- JAVA日志
- struts2后台返回json到jsp页面
- Java基本数据类型及其包装类
- JAVA循环语句和跳转语句
- Java使人内心宁静
- java读取csv文件生成 sql
- Android中级学习笔记(一)之eclipse查看Android源码(图文)
- 《Java程序设计基础》 第5章手记
- 关于提高自己JAVA水平的十大技术
- Java中抽象类与接口的区别
- Java第二次实验
- java 泛型的学习和理解