您的位置:首页 > 职场人生

黑马程序员——java复习总结——反射

2015-08-14 21:52 369 查看
------- 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。

如下,就是对数组进行反射的例子

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: