Class类是反射的源头.
一、 获取类模板对象的方式:
- A:方式一:类名.class
lass clz1=Person.class;
- B:方式二:对象名.getClass()方法
Class clz2=p.getClass();
- C:方式三:Class.forName(“包名+类名的字符串”);
Class clz3=Class.forName("com.hsj.domain.Person");
结论:相同字节码文件对应的类模板是同一个类模板对象.
二、根据类模版获取类的信息:
1、获取类的属性:
- Filed类----c.getFiled(String pname) 获得指定属性(公共字段)
- Filed类----c.getDeclearedFiled(String pname) 获得指定属性(本类中的所有权限字段,不包括父类中的字段信息)
- Filed[]----c.getFileds() 获得所有属性(公共字段)包括本类及其父类中的所有公有字段信息
- Filed[]----c.getDeclearedFileds() 获得所有属性(所有权限字段)只包括本类中的字段信息,不包括父类中的字段信息.
取消java语法检查机制(在类外可以访问私有的成员信息)
field_classNo.setAccessible(true);
在没有使用反射时给成员变量赋值的方式为:对象名.成员变量名=成员变量值;
在使用反射给成员变量赋值的方式为:字段对象(字段名).set(对象名,成员变量值);
field_classNo.set(obj, "001班");
在没有使用反射的情况下获取成员变量的值的方式:数据类型 变量名=对象名.成员变量名;
String name=p.name;
在使用反射的情况下获取成员变量的值的方式为:数据类型 字段值=字段对象.get(对象名);
String name=field_classNo.get(p);
//获取字段中的成分:访问修饰符 数据类型 变量名
Field field_classNo=clz.getDeclaredField("schoolName");
int modifiers=field_classNo.getModifiers();//获取访问修饰符
//System.out.println("modifier="+modifiers);//1=public 2==private 0==default 4==protected
String dataType=field_classNo.getType().getName();//获取字段的数据类型
String fieldName=field_classNo.getName();//获取字段名
Object fieldValue=field_classNo.get(clz.newInstance());//获取指定对象的字段名的字段值
2、获取类的方法:
- Method类----c.getMethod(String methodName,class[] params) 获得指定方法(公共方法)
- Method类----c.getDeclearedMethod(String methodName,class[] params) 获得本类中指定方法(所有方法)不包括父类中的方法 - Method[]----c.getMethods() 获得所有方法(公共方法),包括父类中的方法
- Method[]----c.getDeclearedMethods() 获得本类中所有方法(所有权限方法),不包括父类中的方法.
获取指定方法名(可以带参数的数据类型或者不带参数都行)对应的public修饰符的方法对象
//第一个参数表示方法名,第二个参数表示方法中形参对应的数据类型的变长数组
Method method=clz_student.getMethod("show", String.class,int.class);
//获取本类中指定方法名的方法对象,对方法的访问权限没有要求
Method method=clz_student.getDeclaredMethod("drink", null);
//取消java语法检查
method.setAccessible(true);
method.invoke(clz_student.newInstance(), null);
//调用获取到的方法:
Object obj=clz_student.newInstance();
* p.show();
* method.invoke(p,null);
* 回调指定的方法:方法对象.invoke(对象名,参数列表);
method.invoke(obj, "张三",20);
反射的好处,其实就一句话:高内聚低耦合。把代码动态化,提高了代码的灵活度减少了代码量!
反射的缺点,代码灵活度增大了,自然会带来效率的问题,因此,大量使用反射会带来效率低的问题!