Java反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。

Class类


万物皆对象,类也是对象,任何一个类都是java.lang.Class类的实例对象。
Class类的三种表示方式:


/* 定义一个演示类
*/
Class Foo{}
创建一个Foo类的实例
Foo foo=new Foo();

第一种表示方式:
Class c1=Foo.class; //任何一个类都有一个隐含的静态成员变量class

第二种表示方式:
Class c2=foo.getClass(); //通过该类的getClass()方法创建
注意:c1,c2表示了Foo类的类类型(Class Type),万事万物皆对象,类也是对象,这个对象成为类类型。Foo类的对象指的是foo,Foo类的类类型指的是Class类的对象,
c1=c2,c1和c2都代表了Foo类的类类型,一个类只可能是Class类的一个对象

第三种表示方式:
Class c3=Class.forName(传入路径); //通过Class类的forName()方法。


可以通过类类型创建该类的对象实例–>通过c1或者c2或者c3创建Foo类的对象实例,需要强制类型转换。
Foo foo1=(Foo)c1.newInstance();


Class类动态加载



1.编译时刻加载类是静态加载,运行时刻加载类是动态加载。
2.Class.forName(“类的全称”)不仅表示了类的类类型,还代表了动态加载类
3.new创建对象是静态加载类,在编译时刻就需要加载所有可能用到的类。
4.设计方法:在进行功能类的设计时,尽可能使用动态加载,避免静态加载出现一个问题影响全局的现象。
5.基本的数据类型 void关键字都存在类类型
6.Class类的基本API操作:
获取类的信息:1.获取类的类类型2.通过getName()方法获取类的名称3.通过getMethods()方法获取类的方法保存在Method[]数组中,该方法获取的是public修饰的方法以及从父类继承的方法。(Method类,方法对象,一个方法就是一个Method对象)。
getDeclaredMethods()方法获取的是该类自己声明的方法,不问访问权限。3.通过Method对象的getReturnType()方法获得返回值类型的类类型4.通过Method对象的getName()方法获取到方法的方法名。
5.通过Method对象的getParamterTypes()方法获得参数列表的类型的类类型(Class[])。7.获取成员变量,成员变量也是对象,Field类封装了关于成员变量的操作。getFields()方法获取的是public修饰的成员变量的信息,getDeclaredFields()方法获取的是public修饰的成员变量的信息,getDeclaredField()
方法获取的是该类生成的所有的成员变量的信息。


方法的反射



1.如何获取某个方法?
方法的名称和方法的参数列表才能唯一决定某个方法。
2.方法的反射操作
method.invoke(对象,参数列表)
1.要获取一个方法就是获取一个类的信息,要获取一个类的信息首先要获取类的类类型
2.调用getMethod()或者getDelcared()方法将方法名和参数列表传入来获取方法
3.方法的反射操作是指使用Method的对象来调用方法和使用该类对象调用该方法的效果完全相同。使用method对象的invoke(对象,参数列表)进行调用函数。方法没有返回值返回null,有返回值返回具体的返回值。
反射操作是编译之后的操作,编译之后集合的泛型是去泛型化的,Java中集合的泛型是防止错误输入的,只在编译的时候有效,编译结束就无效了。也就是说想在有泛型限制的容器中添加别的元素,可以通过方法的反射绕过编译阶段去添加。
不过通过方法的反射添加进别的类型的元素之后就不能通过foreach方法遍历了,因为会出现不同的类型。
4.通过反射可以调用类的方法,哪怕是private的方法,从而修改一些默认的行为。