反射

反射介绍:

1.框架设计的灵魂
2.框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
3.将类的各个组成部分封装为其它对象,这就是反射机制

java代码经历的三个阶段:Source(源代码阶段)--类加载器-->Class类对象阶段--创建对象-->Runtime(运行时阶段)

好处:1.在程序运行过程中,操作这些对象
      2.可以解耦,提高程序的可扩展性

获取Class对象的方式:

1.Class.forName("全类名");将字节码文件加载进内存,返回Class对象
    多用于配置文件,将类名定义在配置文件中,读取文件,加载类。
2.类名.class:通过类名的属性class获取
    多用于参数传递
3.对象.getClass():getClass()方法是Object类的方法
    多用于对象获取字节码文件

结论:同一个字节码文件(*.class)在一次程序的运行过程中,只会被加载一次,
不论通过哪种方式获取的Class对象都是同一个

暴力反射:setAccessible(true);

eg:如果想要访问私有的成员变量,那么就要:
    1.先使用Class类对象.getDeclaredField("成员变量名");获取该成员变量的Field对象
    2.因为私有的成员变量值不能直接获取或设置,因此要使用暴力反射
    3.Field对象.setAccessible(true);就可以无视权限修饰符
    4.最后使用Filed对象的get(Object o)方法获取值,使用set(Object o,Object o)方法设置值

Java中是不提倡使用反射的,因为不安全

使用类对象访问成员变量:

            1. 获取成员变量们
            * Field[] getFields() :获取所有public修饰的成员变量
            * Field getField(String name)   获取指定名称的 public修饰的成员变量

            * Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
            * Field getDeclaredField(String name)  

使用类对象创建实例对象:

1.通过Class类对象中的方法获取指定的构造器对象Constructor
2.调用构造器中的newInstance()方法创建对象,返回值是Object;
注意:      
        1.newInstance()方法中的参数是可变参数,这种可变依赖于不同的构造方法的参数列表的不同
        2.获取的是哪个构造方法的Constructor对象,那么使用newInstance()方法创建对象时必须传入与该
          构造方法对应的参数列表,否则报IllegalArgumentException异常

3.如果想要使用私有的构造方法创建对象,只能先通过getDeclaredConstructor()获取指定的私有构造方法的构造器对象
然后使用暴力反射,最后调用newInstance方法获取对象

使用类对象调用类的成员方法:

    1.获取指定的方法,返回该方法的Method对象
    2.通过控制getMethod的参数,来控制获取的Method的对象的不同
    3.getMethod的参数:(方法名,该方法的形参列表的每一个变量的数据类型.class),这样可以区别重载的方法
    4.调用Method类的invoke方法,执行该方法
    5.invoke方法需要传递的参数为:要执行的方法所在类的对象,调用该方法需要的实际参数
    6.如果invoke方法中传递的实际参数与获取Method对象调用getMethod方法传递的参数列表不对应,就会报IllegalArgumentException异常

获取全类名:

    * String getName()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值