Java反射

1 篇文章 0 订阅

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);

反射的好处,其实就一句话:高内聚低耦合。把代码动态化,提高了代码的灵活度减少了代码量!

反射的缺点,代码灵活度增大了,自然会带来效率的问题,因此,大量使用反射会带来效率低的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值