Skip to content

二十一、反射

一、什么是反射

反射允许成员变量,成员方法和构造方法的信息进行编程访问

二、获取class对象

  1. Class.forName("全类名");
  2. 类名.class
  3. 对象.getClass();

1、Class.forName()


格式

java
Class clazz1 = Class.forName("a10.a5.Server");

2、类名.class


格式

java
Class clazz2 = Server.class;

3、对象.getClass();


格式

java
Server server=new Server();
Class clazz3 = server.getClass();

三、获取构造方法

方法名称说明
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有(包含公共的和私有的)构造方法对象的数据
Constructor<?>[] getConstructor(Class<?>...parameterTypes)返回单个公共构造方法对象
Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes)返回所有(包含公共的和私有的)单个构造方法对象

java
Constructor con1 = clazz.getDeclaredConstructor(int.class);

Constructor con2 = clazz.getDeclaredConstructor(String.class , int.class);

1、获取权限修饰符等级

java
int modifiers = con.getModifiers();

2、获取方法参数

java
Parameter[] parameters = con.getParameters();
for(Parameter parameter : parameter){
	// parameter :参数
}

3、创建对象

java
Student stu = (Student) con.newInstance("张三",23);

私有的构造方法需加上con.setAccessible(true)

java
//临时取消权限校验
con.setAccessible(true)

Student stu = (Student) con.newInstance("张三",23);

四、获取成员变量

方法名称说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclareFields()返回所有(包含公共的和私有的)公共成员变量对象的数组
Field[] getField(String name)返回单个公共成员变量对象
Field[] getDeclareField(String name)返回单个(包含公共的和私有的)成员变量对象

1、获取权限修饰符等级

java
Field name =clazz.getDeclaredField("name");
int modifiers = name.getModifiers();

2、获取变量名

java
Field name =clazz.getDeclaredField("name");
String n =name.getName();

3、获取数据类型

java
Field name =clazz.getDeclaredField("name");
Class<?> type = name.getType();

4、获取成员变量记录的值

java
Student s = new Student("张三",23);
name.setAccessible(true);		//如果是私有变量,临时取消权限校验

String value = (String) name.get(s);

5、修改成员变量记录的值

java
Student s = new Student("张三",23);
name.setAccessible(true);		//如果是私有变量,临时取消权限校验

//修改
name.set(s,"hdq");

String value = (String) name.get(s);
System.out.println(s);

五、获取成员方法

方法名称说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method[] getMethod(String name , Class<?> ...parameterTypes)返回单个公共成员方法对象
Method[] getDeclaredMethod(String name , Class<?> ...parameterTypes)返回单个成员方法对象

1、获取权限修饰符等级

java
Method m = clazz2.getDeclaredMethod("eat",String.class);

int modifiers = m.getModifiers();

2、获取方法名

java
Method m = clazz2.getDeclaredMethod("eat",String.class);

String n =m.getName();

3、获取方法形参

java
Method m = clazz2.getDeclaredMethod("eat",String.class);

Parameter[] parameters = m.getParameters();
for(Parameter parameter : parameter){
	// parameter :参数
}

4、获取方法抛出的异常

java
Class[] exceptionTypes = m.getExceptionTypes();
for (Class exceptionType : exceptionTypes) {
    //exceptionType:异常
}

5、调用方法

java
//class对象
Class stuClass = Class.forName("a10.a5.Student");
//获取指定的成员方法
Method m = stuClass.getDeclaredMethod("eat",String.class);

//创建对象实例
Student s = new Student();

//如果是私有方法,临时取消权限校验
m.setAccessible(true);  		

//调用成员方法
String str = (String) m.invoke(s,"热干面");