概念
Java的反射(reflection)機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個(gè)類的對象,可以了解任意一個(gè)對象所屬的類,可以了解任意一個(gè)類的成員變量和方法,可以調(diào)用任意一個(gè)對象的屬性和方法。這種動(dòng)態(tài)獲取程序信息以及動(dòng)態(tài)調(diào)用對象的功能稱為Java語言的反射機(jī)制。反射被視為動(dòng)態(tài)語言的關(guān)鍵。
反射中常用的方法
參考http://www.itdecent.cn/p/9be58ee20dee
案例實(shí)戰(zhàn)
首先創(chuàng)建一個(gè)實(shí)體類
package com.mrhy.springaopbean.model;
import lombok.Data;
@Data
public class TestExcelModel {
private String cityName;
private String countyName;
}
再封裝一層
import lombok.Data;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@Data
public class TestExcelModelList {
private List<TestExcelModel> testList;
private List<TestExcelModel> excelList;
}
案例demo
public static void main(String[] args) throws Exception {
TestExcelModel testExcelModel = new TestExcelModel();
testExcelModel.setCityName("山東");
testExcelModel.setCountyName("濟(jì)南");
TestExcelModelList testExcelModelList = new TestExcelModelList();
List<TestExcelModel> list = new ArrayList<>();
list.add(testExcelModel);
testExcelModelList.setExcelList(list);
testExcelModelList.setTestList(list);
// 獲取testExcelModelList的類
Class clazz = testExcelModelList.getClass();
for (Field field : clazz.getDeclaredFields()) {
// 為了 讓field.get(testExcelModelList)的時(shí)候不拋出異常,所以setAccessible為true
field.setAccessible(true);
// 獲取屬性的名稱
String name = field.getName();
// invoke 讀取實(shí)體類的get方法
String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = clazz.getMethod(methodName);
Object object = method.invoke(testExcelModelList);
System.out.println("屬性名字為:"+name);
System.out.println("方法名為:"+methodName);
System.out.println("該方法的返回結(jié)果為:"+object);
}
}
打印結(jié)果
屬性名字為:testList
方法名為:getTestList
該方法的返回結(jié)果為:[TestExcelModel(cityName=山東, countyName=濟(jì)南)]
-----------------
屬性名字為:excelList
方法名為:getExcelList
該方法的返回結(jié)果為:[TestExcelModel(cityName=山東, countyName=濟(jì)南)]
-----------------
收工,學(xué)無止境,記錄一下