黑马程序员---java 反射 学习笔记

---------------------- android培训java培训、期待与您交流! ----------------------

反射:

     1. 概念

          反射就是在程序运行过程中, 动态地获取类及类中成员变量,构造函数, 成员方法的机制. 也可以理解为就是对类的解剖;

在java中每一个类都会生成相应的节码文件. 字节码文件中包含了类的属性和方法. 多个类的类文件都有所相同之处, 把每个具体的类文件向上抽取就得到了Class类. 用这个类来描述这样的事物;  

反射的特点和好处:

     以前的应用程序要想使用已有的对象, 在不去改动源文件的前提下. 就可以用到反射机制. 只需要把后来出现的类名告诉应用程序. 让类通过配置文件呢和该应用程序关联起来. 不用修改源代码, 只需要修改配置文件即可;

     大大的提高了程序的扩展性;

2. 反射中最常用的四个类:   

          Class 类是用来描述内存中的字节码文件,该类对象就是内存中加载的字节码文件

获取Class对象有三种方式::

                       <1>. (最常用方法) forName(String )方法通过字符串形式的类名获取Class对象;

                           <2>.(不常用方法)通过Object类中的getClass()方法;获取指定对象的Class对象;

                            <3>.类名.class(), 直接获取指定的Class对象;

<4>使用Class类的newInstance()方法可以根据字节码文件创建对象,该方法是使用当前类的无参构造函数创建对象,如果没有无参的构造函数,那么就会抛出异常;

       Constructor (构造函数的类)

                            <1>Class类中的方法getConstructor(class….) 可以根据参数类型获取到该类的构造函数;

                            <2>Constructor类中的方法newInstance(Oject….)可以调用构造函数创建对象, 传入指定的参数;

              Method(方法的类)

                            获取方法步骤:

                          <1>. 首先获取该类的字节码文件对象;

                          <2>. 可用getMethods() . getDeclaredMethods() 来获取相应的方发法, 第二个可以获取到私有的方法,获取单个方法用getMethod(String name , Class[] paramType)

                                 如 : Method  m = clazz.getMethod("equals", Object.class); 

                          <3>. 运行获取到的方法用invoke(obj , new Object()); 此外还可以获取方法的返回值类型 , 参数类型等

              Constructor 构造器, 获取该字节码文件中的构造函数

     没有空参数的构造函数,就需要获取指定的构造函数对象, 并且通过该构造函数进行初始化: 如:   Constructor con = c.getConstructor(String.class);

                             Object obj = con.newInstance("张三");

                             然后再用该对象去getMethod(str , Class...);

                              对于静态方法,则不需要建立对象, 获取方法对象后直接invoke;如:

                               Method m = c.getMethod("show" , null);

                              m.invoke(null , null);

                         

 

                  File(这个类对象代表了每一个字节码文件中的字段属性)

                          获取类文件字段属性步骤:

                          1. 先用Class类的forName()方法获取该类的字节码文件对象

                          2. 拿到字节码文件对象后, 用getField(str), getFields(), getDeclaredFields() 等多种方式获得其相应的字段对象(私有属性只能用getDeclaredFields()才能获取)

                          3. 拿到字段对象后, 首先可以用getName()等获取其一般信息, 但是此时还不能获取到它的值, 因为一个字节码文件可能被多个类的实例对象所共享, 所以要想获取它的值, 必须拥有一个该类的对象实例支持

                          4. 用字节码文件对象的newInstance()方法创建一个对象实例(此方法要求该类必须有一个空参数的构造函数)

                          5. 调用字段对象获取值的相应方法, 并将创建的对象实例传入,

                          6. 如果该字段是私有的, 可以用字段的setAccessible(true)来取消对该私有属性访问的权限检查, 但这是一种暴力访问, 不建议使用;

---------------------- android培训java培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值