反射简单讲就是把一个java类中的所有成分都映射成一个相应的java类。这个java类包含有前一个类的相关信息。
通过反射得到的是相应累得字节码文件,总共有三种加载字节码的方式: 1、类名.class 2、对象.getClass(); 3、Class.forName("");//这里要为类的全路径:包名.类名
一、预定义Class实例对象,8个基本类型对象和一个void对象。
void即void.class
isPrimitive():是否是原始类型。
如:int.class.isPrimitive() 返回值为true
数组类型的Class实例对象
如:int[].class.isArray() 返回值为true
只要在源程序中出现的类型,都有各自的Class实例对象。
二、Constructor类代表某个类中的一个构造方法。
反射利用getConstructor()获取构造方法。
一个类通常有不止一个构造函数,getConstructor()通过构造函数的参数个数和类型的不同来区分
如:Constructor c=String.class.getConstructor(StringBuffer.class)//一个StringBuffer类型的参数
利用构造方法实现一个对象,传递参数
c.newInstance(new StringBuffer("aaa"));
三、Field类代表某个类中的一个成员变量。
反射中,如果出现private修饰的变量。想要得到它时,需要用到暴力反射将
获取公共成员字段的getField()修改成getDeclaredField()获得声明的字段。同时还要设置该变量
setAccessible(true)就可以获得类文件中私有变量的属性了
四、Method代表某个类的一个成员方法。
注:反射得到的方法并不属于某个对象
如:Method m=String.class.getMethod("charAt",int.class);//参数为 方法的名称 方法的参数
String str="abc";
利用反射得到str的charAt方法:
m.invoke(str,1);//参数为 对象名称 传的参数
如果传递给Method对象的invoke()方法的第一个参数为null,
这说明Method对象对应的是一个静态方法