反射可以在代码运行时,动态的获取对象、调用方法、设置属性。动态操作,降低代码偶合性,提高灵活度。其JDBC
库就是通过反射加载。
实例操作
以操作User
对象为例:
/*
* File:User.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/08/31 10:18:31
*/
package com.ichochy.example;
public class User {
private String name = "iChochy";
private int age = 32;
private String url = "https://ichochy.com";
public void display(){
System.out.println("Name:"+name);
System.out.println("Age:"+age);
System.out.println("URL:"+url);
}
}
正常调用
User user = new User();
user.display();
获取对象
类动态获取
//获取类
Class<?> clazz = User.class;
//获取对象
Object obj = clazz.newInstance();
类路径获取
//获取类
Class<?> clazz = Class.forName("com.ichochy.example.User");
//获取对象
Object obj = clazz.newInstance();
获取属性
获取全部
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
System.out.println(field.getName());//name、age、url
}
属性名获取
Field field = clazz.getDeclaredField("age");
System.out.println(field.getName());//age
设置属性
Object obj = clazz.newInstance();
Field field= clazz.getDeclaredField("age");//获取私用属性
field.setAccessible(true);//设置反射访问权限检查
System.out.println(field.get(obj)); //32
field.set(obj,18);//设置属性
System.out.println(field.get(obj));//18
获取方法
获取全部
Method[] methods = clazz.getMethods();
for(Method method:methods){
System.out.println(method.getName()); //display
}
方法名获取
Method method = clazz.getMethod("display");
System.out.println(method.getName()); //display
调用方法
Object obj = clazz.newInstance();
Method[] methods = clazz.getMethods();
for(Method method:methods){
//调用 display 方法
if("display".equals(method.getName())){
method.invoke(obj);
}
}
方法名调用
Object obj = clazz.newInstance();
Method method = clazz.getMethod("display");
method.invoke(obj);