------- android培训、java培训、期待与您交流! ----------
一、Class类
1.1 Class类的概念
Class类可以说是反射的基石。在java程序中的各个java类属于同一事物,描述这类事物的java类名就是Class。
Class类代表java类,它的各个实例对象就是各个类在内存中的字节码,例如Person类的字节码,ArrayList类的字节码等等,一个类被类加载器加载到内存中,这个空间里面的内容就是累的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个对象表示,这些对象显然具有相同的类型,这个类型就是Class类。
1.2 Class类的获取方式
Class类没有构造函数,不能通过new获得,想要活动Class类有三种方式:
第一种:
类名.Class。如要获取Date类的字节码:Date.class
第二种:
对象.getClass().如,要获取String类的字节码,若str是String的一个实例对象,则可以用str.getClass()获得String的字节码。
第三种:
Class.forName(“类名”)。如要获取String的字节码,可以这样写:Class.forName(“java.lang.String”);
1.3 Class类的特点
对于Class,同一个类的字节码是唯一的,所以若有多个对象指向同一个类的字节码,则它们是相等的,可以用== 进行比较。
二、反射
2.1 反射的概念
反射就是把java类中,各种成分映射成相应的java类,例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造函数,包等等信息也可以用一个个java类来表示,就像汽车是一个类,汽车的发动机,变速箱等等也是一个个类。
所以,java类中提供了Class类来提供了一系列方法,来获得其中的变量,方法,构造方法,修饰符,包等信息。这些信息就是用相应类的实例对象来表示,他们分别是Field,Method,Contructor.Package等等。
2.2 Constructor类
Constructor类代表某个类中的一个构造方法,得到某个类所以的构造方法:
Constructor constructors[] = Class.forName(“java.lang.String”).getConstructs();
得到某个类某一个构造方法:
Constructor constructor = Class.forName(“java.lang.String”).getConstruct(“参数类型”);这样就可以获得对应参数类型的构造方法
通过这些构造方法,就可以获得对应类的对象。如
String str = (String)constructor.newInstance(newStringBuffer(“abc”));
2.3 Field类
Field类代表某个类中的一个成员变量,通过他就可以获得该变量的值,哪怕该变量是私有变量
如下,就是一个使用反射的例子
2.4 Method类
Method类代表某一个类中的一个成员方法,得到类中的某一个方法如下:
Method MethodcharAt = Class,forName(“java.lang.String”).getMethod(“charAt”,intclass)
这个方法有两个参数,第一个是方法名,要得到什么方法就传入什么名字,第二个是方法的参数,因为方法有重载,所以需要传入对应的参数。
使用过程是先得到方法,然后再对于某个对象调用这个方法。
调用方法:invoke(对象,参数);调用这个方法,需要传入两个参数,要调用哪个对象身上的方法,需要传入对应的对象。如果对象的null,那么说明这个方法是静态的。然后使用什么参数,也需要传入对应的参数。如果传入多个参数,那么可以传入多个参数,这是因为此处的可变参数。
如下就是对这个方法是使用:
MethodcharAt.innvoke(str,1);就是要调用str身上的这个方法,参数是1.
2.5 用反射的方式执行某个类中的main方法
用处:当要运行的类未知时,可以使用参数用于接受该类的类名,然后通过类名获得该类的main方法,然后传入参数运行这个main方法。这样就可以在写程序的时候,利用反射的特点,将程序的功能实现,后期传入需要运行的类名就行了。
2.6 数组的反射
数组也是一种类型,具有相同维数和元素类型的数组属于同一个类型,他们具有相同的Class实例对象。代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类的对应Class。
注意:基本类型的一维数组只能整体被当做一个Object类型使用,即一个对象。不能当做Object[]类型使用,因为它们里面封装的基本类型的数据并不是对象。非基本类型的一维数组,既可以当做Object类型使用,也可以当做Object[]类型使用。
例如:
对于这两个比较,第一个是true,第二个是false。
对于这些数组,父类都是Object。
如下,就是对数组进行反射的例子