准备
先准备一个实体类User.java:
package com.example.reflect;
public class User {
private String id;
public String name;
private String telephone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
获取Class对象方式
反射第一步:获取某个类的Class对象————有3种获取方式
- 法1:Class<?> clazz = Class.forName(“完整类路径”);
Class<?> clazz1 = Class.forName(“com.example.reflect.User”);
- 法2:Class<?> clazz = 类名.class;
Class<?> clazz2 = User.class;
- 法3:Class<?> clazz = 类的实例名.getClass();
User user = new User();
Class<?> clazz3 = user.getClass();
代码示例
接下来使用User实体类对反射实现方法进行演示:
package com.example.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
//===============反射第一步:获取某个类的Class对象————有3种获取方式
//********法1:Class<?> clazz = Class.forName("完整类路径");
Class<?> clazz1 = Class.forName("com.example.reflect.User");
//********法2:Class<?> clazz = 类名.class;
Class<?> clazz2 = User.class;
//********法3:Class<?> clazz = 类的实例名.getClass();
User user = new User();
Class<?> clazz3 = user.getClass();
//===============获取某个类的属性(包含属性的 修饰符、类型、属性名 等信息)
//*** 1.获取所有属性
Field[] fields = clazz1.getDeclaredFields();
//*** 2.获取特定属性名的字段对象————方便对特定值重新赋值
Field nameField = clazz1.getField("name");
//获取属性的修饰符、类型、名称
String attributeModifier = Modifier.toString(nameField.getModifiers());
Class<?> attributeType = nameField.getType();
String attributeName = nameField.getName();
//对name重新赋值——先创建实例对象,再赋值
User user1 = (User)clazz1.newInstance();
nameField.set(user1,"神乐");
//===============获取某个类的方法(包含方法的 修饰符、返回类型、方法名 等信息)
//*** 1.获取所有方法
Method[] methods = clazz1.getDeclaredMethods();
//*** 2.获取【特定方法名,特定参数类型】的方法对象————方便调用特定方法
Method setNameMethod = clazz1.getMethod("setName",String.class);
//调用特定方法——先创建实例对象,再调用方法
setNameMethod.invoke(user1,"新巴基");
}
}