反射的简单使用
查考文章
整理Java反射常用方法 https://blog.csdn.net/github_35180164/article/details/52037112
深入解析Java反射(1) - 基础 https://www.sczyh30.com/posts/Java/java-reflection-1/
反射是什么
反射:允许任意一个类在运行时获取自身的类信息,并且可以操作这个类的方法和属性。这种动态获取类信息和动态调用对象方法的功能称为Java的反射机制。
为什么要用反射
通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁
反射可以降低程序耦合性,提高程序的灵活性
反射常用类
java.lang.reflect.Constructor<T>
:与构造函数相关的反射java.lang.reflect.Field
:与字段相关的反射java.lang.reflect.Method
:与方法相关的反射java.lang.reflect.Modifier
:与修饰符相关的反射
反射常用方法
-
Field相关
- Class.getDeclaredFields() : 获取当前类所有的(包括私有)字段
- Class.getDeclaredField(String) : 获取单个字段(包括私有)
- Class.getFields() : 获取当前类所有的(不包括私有)字段
- Class.getField(String) : 获取单个字段(不包括私有)
-
Method相关
- Class.getDeclaredMethods() : 获取类本身的所有方法,包括公有、保护、私有
- Class.getDeclaredMethod(String, Class[]) : 获取类本身的指定方法,包括公有、保护、私有
- Class.getMethods() : 获取类本身和其所有父类的公有和保护方法
- Class.getMethod(String, Class[]) : 获取类本身和其所有父类指定的公有和保护方法
反射的运用
- 测试 user 类
public class User {
private String username;
private String password;
public User() {
super();
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String privateMethod(String str) {
return "这是调用私有方法:" + str;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
获得 Class 对象三种方法
- 使用 Class.forName 静态方法:
public static Class<?> forName(String className)
例如:
try {
Class<?> userClass = Class.forName("com.test.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
- 调用对象的 class
Class<?> userClass = User.class;
- 调用某个对象的 getClass() 方法
User user = new User();
Class<? extends User> userClass = user.getClass();
创建对象实例
@Test
public void run(){
try {
Class<?> userClass = Class.forName("com.test.User");
// 直接使用Class.newInstance()方法来创建Class对象的无参构造生成实例对象
User user1 = (User) userClass.newInstance();
user1.setUsername("小茗");
user1.setPassword("123ABC");
System.out.println("无参构造生成实例对象: " + user1.toString());
// 使用 java.lang.reflect.Constructor 类生成有参构造生成实例对象
// getConstructor(Class... arg0) 参数为Java的可变参数 传入类型为 java.lang.Class 类型
Constructor<?> constructor = userClass.getConstructor(String.class, String.class);
User user2 = (User) constructor.newInstance("小黄", "ABC123");
System.out.println("有参构造生成实例对象 : " + user2.toString());
} catch (ClassNotFoundException e