前言
Java的反射机制,可以使程序在运行过程中获取类信息;
我们经常使用的jdbc就是使用反射去加载的,展示:
Class.forName("com.mysql.cj.jdbc.Driver");
一、准备
1. 实体类
package org.example.po;
import java.util.Date;
/**
* Create by zjg on 2024/4/5
*/
public class Car {
public String name;
private Date factoryDate;
private int mileage;
public Car() {
}
private Car(String name, Date factoryDate, int mileage) {
this.name = name;
this.factoryDate = factoryDate;
this.mileage = mileage;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getFactoryDate() {
return factoryDate;
}
public void setFactoryDate(Date factoryDate) {
this.factoryDate = factoryDate;
}
public int getMileage() {
return mileage;
}
public void setMileage(int mileage) {
this.mileage = mileage;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", factoryDate=" + factoryDate +
", mileage=" + mileage +
'}';
}
private int getBattery(){
System.out.println("获取电池健康状态");
return 100;
}
}
二、反射
1. getClass
package org.example;
import org.example.po.Car;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
/**
* Create by zjg on 2024/4/5
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello reflect!");
try {
getClass(args);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void getClass(String[] args)throws Exception {
//1.获取class对象
Class<Car> car1 = Car.class;
System.out.println(car1);
Class<? extends Car> car2 = new Car().getClass();
System.out.println(car2);
Class car3=Class.forName("org.example.po.Car");
System.out.println(car3);
}
}
Hello reflect!
class org.example.po.Car
class org.example.po.Car
class org.example.po.Car
2. getConstructor
package org.example;
import org.example.po.Car;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
/**
* Create by zjg on 2024/4/5
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello reflect!");
try {
getConstructor();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void getConstructor()throws Exception{
//2.获取Constructor
//public
Class<?> car = Class.forName("org.example.po.Car");
Object o1 = car.getConstructor().newInstance();
System.out.println(o1);
//private
Constructor<?> declaredConstructor = car.getDeclaredConstructor(String.class, Date.class, int.class);
declaredConstructor.setAccessible(true);
Object o2 = declaredConstructor.newInstance("su7", new Date(), 0);
System.out.println(o2);
}
}
Hello reflect!
Car{name=‘null’, factoryDate=null, mileage=0}
Car{name=‘su7’, factoryDate=Sat Apr 13 14:11:47 CST 2024, mileage=0}
3. getFiled
package org.example;
import org.example.po.Car;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Create by zjg on 2024/4/5
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello reflect!");
try {
getFiled();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void getFiled()throws Exception{
//3.获取Filed
Class<?> car = Class.forName("org.example.po.Car");
Object o1 = car.getConstructor().newInstance();
//data
Map<String,Object> data=new HashMap<>();
//public
data.put("name","su7 max");
//private
data.put("factoryDate",new Date());
data.put("mileage",100);
Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, Object> next = iterator.next();
String key = next.getKey();
Object value = next.getValue();
Field field = car.getDeclaredField(key);
if(!field.canAccess(o1)){
field.setAccessible(true);
}
field.set(o1,value);
System.out.println(field.get(o1));
}
System.out.println(o1);
}
}
Hello reflect!
su7 max
Sat Apr 13 14:15:46 CST 2024
100
Car{name=‘su7 max’, factoryDate=Sat Apr 13 14:15:46 CST 2024, mileage=100}
4. getMethod
package org.example;
import org.example.po.Car;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
/**
* Create by zjg on 2024/4/5
*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello reflect!");
try {
getMethod();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void getMethod()throws Exception{
//4.获取Method
Class<?> car = Class.forName("org.example.po.Car");
Object o1 = car.getConstructor().newInstance();
//public
Method method = car.getMethod("setFactoryDate", Date.class);
method.invoke(o1,new Date());
System.out.println(car.getMethod("getFactoryDate").invoke(o1));
//private
Method declaredMethod = car.getDeclaredMethod("getBattery");
declaredMethod.setAccessible(true);
System.out.println(declaredMethod.invoke(o1));
}
}
Hello reflect!
Sat Apr 13 14:17:05 CST 2024
获取电池健康状态
100