------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流>-----
反射(一)
1. 反射概念
反射技术:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简而言之:反射就是把Java类中的各种成分映射成相应的java类。
2. Class类
(1)Class类:Java程序中的各个Java类属于同一类事物,描述这类事物的Java类就是Class类。
对比理解: 人 Peoson ----------- Java类 Class
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的。一个类在虚拟机中只有一份字节码。
Class类的实例对象是各个类在内存中的字节码。比如Peoson类的字节码,Integer类的字节码,String类的字节码等等均是它的实例对象。
(2)获取Class实例对象的三种方式:
方式一:通过对象的getClass()方法进行获取。
如:Classclazz=new Person().getClass();//Person是一个类名
麻烦之处:每次都需要具体的类和该类的对象,以及调用getClass方法。
方式二:任何数据类型都具备着一个静态的属性class,这个属性直接获取到该类型的对应Class对象。
如:Classclazz=Person.class;//Person是一个类名
比第一种较为简单,不用创建对象,不用调用getClass方法,但是还是要使用具体的类,和该类中的一个静态属性class完成。
方式三:这种方式较为简单,只要知道类的名称即可。不需要使用该类,也不需要去调用具体的属性和行为。就可以获取到Class对象了。
如:Classclazz=Class.forName("包名.Person");//Person是一个类名
这种方式仅知道类名就可以获取到该类字节码对象的方式,更有利于扩展。
该方法最为常用。
(3)九个预定义的Class:
<1>包括八种基本类型(byte、short、int、long、float、double、char、boolean)的字节码对象和一种返回值为void类型的void.class。
<2>Integer.TYPE是Integer类的一个常量,它代表此包装类型包装的基本类型的字节码,所以和int.class是相等的。基本数据类型的字节码都可以用与之对应的包装类中的TYPE常量表示。
3.Class类中的构造方法Constructor类、字段Field类、方法Method类
(1) Constructor 类
Constructor类用于描述类中的构造方法:
Constructor getConstructor(Class... parameterTypes)
返回该Class对象表示类的指定的public构造方法;
Constructor[] getConstructors()
返回该Class对象表示类的所有public构造方法;
Constructor getDeclaredConstructor(Class... parameterTypes)
返回该Class对象表示类的指定的构造方法,和访问权限无关;
Constructor[] getDeclaredConstructors()
返回该Class对象表示类的所有构造方法,和访问权限无关;
(2) Field类
FieldgetField(String name)
返回一个Field对象,它表示此Class对象所代表的类或接口的指定公共成员字段。
Field[]getFields()
返回包含某些Field对象的数组,表示所代表类中的成员字段。
(3) Method类
Method类用于描述类中的方法:
Method getMethod(String name, Class ... parameterTypes)
返回该Class对象表示类和其父类的指定的public方法;
Method[] getMethods():
返回该Class对象表示类和其父类的所有public方法;
Method getDeclaredMethod(String name, Class... parameterTypes)
返回该Class对象表示类的指定的方法。和访问权限无关,但不包括继承的方法;
Method[] getDeclaredMethods(): 获得类所有的方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;