Spring之反射

反射

     在运行状态中,对于任意一个类都能够知道它的属性和方法,对于任意一个对象都能够调用他的属性和方法,这样的动态获取属性和方法和动态调用属性和方法的功能就叫做反射。

获取Class对象的方法

 

  1. 调用对象的getClass()方法(这种方法,已经有对象了,为什么还需要得到其Class对象?)
  2. 通过调用对象的class属性,每一个数据类型都有一个静态的静态属性class
  3. Class类的静态方法forName("真实路径"):真实路径:包名.类名

注:三种获取方式得到的Class对象是一样的,因为在运行期间,一个类只有一个Class对象

获取构造函数并获取实例

 
Class clazz = Class.forName("baoming.leiming");
Constructor[] conArray = clazz.getConstructors();//获取所有公共的构造方法
conArray = clazz.getDelaredConstructors();//获取所有构造方法(公有、私有、受保护)
Constructor con = clazz.getConstructor(null);//获取公有无参构造方法
con.setAccessible(true);//如果是要访问受保护或私有方法或属性时,需要设置此属性为true
object obj = con.newInstance(参数);//通过构造方法获取实例

获取成员变量并调用

 
Class clazz = Class.forName("baoming.leiming");//获取Class对象
Object obj = clazz.getConsturctor().newInstance();//通过无参构造方法获取实例

   Field[] fieldArray = clazz.getFields();//获取所有公共属性   fieldArray = clazz.getDeclaredFields();//获取所有属性(公共、私有、受保护)   Field field = clazz.getField("name");//获取name属性   field.set(obj,"陈奕迅");//为其属性设置值

注:设置变量值的时候需要传递两个参数,第一个参数:被设置的对象;第二个参数:要传入的实参

获取成员方法并调用

Class clazz = Class.forName("baoming.leiming");//获取Class对象
Object obj = clazz.getConstructor().newInstance();//通过无参构造方法获取实例
Method[] methodArray = clazz.getMethods();//获取所有公共的方法
//与上节类似
Method method = clazz.getMethod("method1",String.class);//获取公有的method1方法,参数类型是String
method.invoke(obj,"陈奕迅");//调用method1方法,输出陈奕迅(假设method1方法,参数是string,作用是输出string)
method = clazz.getDeclaredMethod("method2",int.class);//获取私有方法method2,参数类型是int
method.setAccessible(true);//调用私有方法时,需要设置此属性为true
Object result = method.invoke(obj,20);//调用method2私有方法,返回int型,使用result接收返回结果(假设私有方法method2,参数是int,作用是返回一个int数据)

反射机制的作用

优点:增强程序的灵活性,避免将程序写死在代码里面

缺点:反射会导致性能降低,复杂度增加

总结心得:

首先通过Class,无论是哪种方式获得类的class对象,有了class对象后,便可以通过class对象调用无参或有参构造函数来创建实例(class.getConstructor(null).newInstance()),之后便可以获取其中的方法(公共、保护、私有都可以,不过保护或私有得设置setAccessible(true)),然后通过实例调用此方法(invoke(object, params))。

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值