1、反射的概述
1) 什么是Java的反射机制
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
2) Java反射机制的作用
是用来编写一些通用性较高的代码或者框架的时候使用。
2、反射常用对象的概述
1) Class
--Class类的实例表示正在运行的Java应用程序中的类和接口
2) Construtor
--关于类的单个构造方法的信息以及对他的访问权限
3) Field
--Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限
4) Method
--Method提供关于类或接口上某个方法的信息
3、Class类概述和使用
1) Java中java.lang.Class类用于表示一个类的字节码(.class)
2) 如何得到某个class文件对应的Class对象
1) 已知类或对象的情况下
类名.class
对象.getClass() --Object类提供
2) 未知类和对象的情况下
Class.forName(“包名.类名”)
--Class类代表某个类的字节码,并提供了加载字节码的方法:
forName(“包名.类名”),forName方法用于加载类字节码到内存中,并封装成一个Class对象
4、Constructor类
1) Constructor类的实例对象代表类的一个构造方法
2) 得到某个类的所有构造方法
Constructor[] constructors=Class.forName(“java.lang.String”).getConstructors();
3) 得到指定的构造方法并调用
Constructor c=Class.forName(“java.lang.String”).getConstructor(String.class);
String str=(String)c.newInstance(“abc”);
4) Class类的newInstance()方法用来调用类的默认构造方法
String obj=(String)Class.forName(“java.lang.String”).newInstance();
5、Field类
1) Field类代表某个类中的一个成员变量,并提供动态的访问权限
2) Field对象的获取
-得到所有的成员变量
--Field[] fields=c.getFields(); //取得所有public属性(包括父类继承)
--Field[] fields=c.getDeclaredFields(); //取得所有声明的属性(包括私有的)
-得到指定的成员变量
--Field name=c.getField(“name”);
--Field name=c.getDeclaredField(“name”);
3) 设置Field变量是否可以访问(操作私有属性时需设为true)
--field.setAccessible(boolean);
4) Field变量值的读取、设置
--field.get(obj);
--field.set(obj,value);
注:
obj:类的实例化对象
6、Method类
1) Method类代表某个类中的一个成员方法
2) Method对象的获得
(1) 获得所有方法
--getDecaredMethods() //获得所有(包含私有)方法
--getMethods() //获得所有公有方法
(2) 获得指定方法
--getDeclaredMethod(String name,Class<?>…parameterTypes)
--getMethod(String name, Class<?>…parameterTypes)
注:
name:方法名
Class<?>…parameterTypes:方法的参数类型列表
3) 通过反射执行方法
invoke(Object obj,Object… args)
注:
obj:类的实例化对象
args:方法的具体参数