java基础–反射
反射的基础介绍
- 什么是反射
简单来说,反射是一种机制,通过该机制可以在程序运行过程中对类进行解剖,操作类的所有成员,包括构造方法,成员属性和成员方法 - 应用场景
(1) 开发IDE(集成开发环境)
(2) 开发框架
Class对象
- 介绍
使用反射则必须获取类对应的Class对象,每个类的Class对象都是唯一的 - 获取Class对象的方式
(1) 类名.class
Class c1 = String.class;
System.out.println(c1);
(2) 对象调用getClass()方法,这个方法是Object类定义的
Class c2 = str.getClass();
(3) 通过Class类的静态方法forName(“类全名”)
Class c3 = Class.forName("java.lang.String");
System.out.println(c1 == c2);
- Class类的常用方法
方法 | 说明 |
---|---|
String getSimpleName() | 获取类名 |
String getName | 获取类全名 |
T newInstance() | 创建类的对象,默认是通过无参构造方法创建对象(jdk1.9不再使用) |
- Class类获取Constructor对象的方法
方法 | 说明 |
---|---|
Constructor getConstructor(Class… parameterTypes) | 获取Constructor对象 ,只能获取public修饰的构造方法对象。根据相应的参数类型获取构造方法对象,不传参数就是无参构造,传参则是有参构造。注意参数是Class类型 |
Constructor getDeclaredConstructor(Class… parameterTypes | 与上面的作用相同,而且还可以获取到private修饰的构造方法对象 |
Constructor[] getConstructors() | 获取所有public修饰的构造方法对象 |
Constructor[] DeclaredConstructors() | 获取所有的构造方法对象,包括private修饰的 |
- Class类获取Method的方法
方法 | 说明 |
---|---|
Method getMethod(String name,Class… params) | 根据名称与参数获取相应的Method对象,只能获取public修饰的。name表示方法名,params表示方法参数的class对象 |
Method getDeclaredMethod(String name,Class… params) | 与上面相同,包括获得private修饰的 |
Method[] getMethod | 获取所有public修饰的成员方法对象 |
Method[] getDeclareMethods() | 获取所有成员方法对象,包括private修饰的 |
- Class类获取Field对象的方法
方法 | 说明 |
---|---|
Field getField(String name) | 获取Filed对象,只能获取public修饰的 |
Field getDeclaredField(String name) | 获取Field对象,包括private修饰的 |
Field[] getFields() | 获取所有public修饰的成员变量相对应的Field对象 |
Field getDeclaredFields() | 获取所有成员变量对应的Field对象 |
Constructor类
-
概括
类的每一个构造方法都是一个Constructor对象,在反射机制中,创建类的对象需要获得该类构造方法对应的Constructor对象 -
Constructor常用方法
方法 | 说明 |
---|---|
T newInstance(Object… initargs) | 创建对象。不传参数就是无参构造,传参则是有参构造 |
void setAccessible(boolean flag) | 设置是否取消权限检查,设置为true才可以执行private修饰的构造方法 |
无参构造方法
Class c = Student.class;
//无参
Constructor constructor = c.getConstructor();
Student student = (Student) constructor.newInstance();
System.out.println(student);
有参(public)
Class c = Student.class;
//有参(public)
Constructor constructor = c.getConstructor(int.class, String.class);
Student student = (Student)constructor.newInstance(18, "张三"); // Student{id=18, name='张三'}
System.out.println(student);
有参(private)
Class c = Student.class;
//有参(private)
Constructor constructor = c.getDeclaredConstructor(String.class);
constructor.setAccessible(true);//true = 取消权限检查
Student student = (Student) constructor.newInstance("李四");
System.out.println(student);//Student{id=0, name='李四'}
Method类
- 概述
类的每一个成员方法都对应一个Method对象,反射操作成员方法就是要获得成员方法对应的Method对象来调用该方法 - Method类常用方法
方法 | 说明 |
---|---|
Object invoke(Object obj, Object… args) | 执行方法。obj指定是哪一个对象的方法;args表示方法要传递的参数;invoke方法存在返回值,执行的方法返回什么invoke方法就返回什么 |
void setAccessible(boolean flag) | 设置是否取消权限检查,设置为true才能执行private修饰的方法 |
public
Class c = Student.class;
//学生对象
Student student = (Student) c.newInstance();
//获取public修饰的成员方法对象
Method studyMethod = c.getMethod("study", String.class, int.class);
studyMethod.invoke(student,"小明",3);
private
Class c = Student.class;
//学生对象
Student student = (Student) c.newInstance();
//获取private修饰的成员方法对象
Method shoppingMethod = c.getDeclaredMethod("shopping", String.class);
//取消权限检查
shoppingMethod.setAccessible(true);
//执行方法
shoppingMethod.invoke(student,"小明");
静态方法
Class c = Student.class;
//学生对象
Student student = (Student) c.newInstance();
//获取public修饰的静态方法
Method singMethod = c.getMethod("sing", String.class);
//执行方法
String result = (String) singMethod.invoke(null,"一首歌的时间");//执行静态方法不需要传入对象
System.out.println(result);
Field类
- 概述
类的每一个成员变量都对应一个Field对象,使用反射来操作成员变量,就是要获得成员变量对应的Field对象来给成员变量赋值和取值 - Field对象常用方法
方法 | 名称 |
---|---|
void set(Object obj, Object value) | 赋值。obj指定是哪一个对象的成员变量,value表示赋的值 |
void setxxx(Obejct obj, xxx i) | xxx表示基本类型 |
Object get(Object obj) | 获取值。obj指定是哪一个对象的成员变量 |
xxx getxxx(Object obj) | xxx表示基本类型。obj指定是哪一个对象的成员变量 |
void setAccessible(boolean flag) | 设置是否取消权限检查,设置为true才能获取或赋值private修饰的成员变量 |
Class getType() | 获取属性的类型,返回Class对象 |
String getName() | 获取属性名称 |