反射:
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培训、期待与您交流! ----------------------