Java利用反射實(shí)現(xiàn)文件的讀取操作
java反射
java從很早的版本開(kāi)始就引入了反射機(jī)制,java如今的框架底層大部分也都是使用反射實(shí)現(xiàn)的。
這篇博客就去探索下java反射使用的方便之處。
要說(shuō)java的反射機(jī)制,肯定離不開(kāi)Class這個(gè)類,我們從jdk的源碼可以看到這個(gè)類在jdk1.0的時(shí)候就存在了。

由于我這邊需要用到文件讀寫(xiě)的功能,同時(shí)又希望寫(xiě)的方法相對(duì)來(lái)說(shuō)比較抽象,能在多出直接使用,于是我就想到了java的反射機(jī)制。
首先這邊先把我的讀取文件的方法展示出來(lái)
這個(gè)是用到的接口類
/**
* 實(shí)現(xiàn)該接口中的方法,本來(lái)打算在FileUtils中調(diào)用該方法來(lái)生成實(shí)體對(duì)象,現(xiàn)已使用反射實(shí)現(xiàn)
* @param <E>
*/
public interface Readable<E> {
E readStr(Object[] objs);
}
由于在方法中使用了泛型,想要調(diào)用某個(gè)自定義的方法,就只能規(guī)定泛型的類要實(shí)現(xiàn)某個(gè)接口,這樣就可以直接調(diào)用接口中的方法。
下面是我的文件讀取方法
/**
* 從文件中讀取所需要的數(shù)據(jù),并自動(dòng)生成class對(duì)象添加到List中
* @param tailPath 文件的名字(須帶擴(kuò)展名)
* @param clazz List中存儲(chǔ)對(duì)象的Class對(duì)象
* @param paramType 所存入的對(duì)象的構(gòu)造函數(shù)的參數(shù)的Class對(duì)象(該構(gòu)造函數(shù)不能被private或protect修飾)
* @param <T> List中的泛型,也就是List中存儲(chǔ)對(duì)象的類型
* @return 通過(guò)讀取文件所得到的List對(duì)象
* @throws IOException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public static <T extends Readable<T>> MyList<T> read(String tailPath, Class<T> clazz, Class[] paramType)
throws IOException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
// basePath要讀取文件的文件夾路徑
String path = basePath + "\\" + tailPath;
// 創(chuàng)建一個(gè)文件流
BufferedReader br = new BufferedReader(new FileReader(path));
// 這個(gè)MyArrayList是我自己寫(xiě)的一個(gè)順序表,可直接替換成java提供的ArrayList
MyList<T> list = new MyArrayList<>();
// 通過(guò)方法傳入的class和參數(shù)列表獲取類的構(gòu)造方法
Constructor<T> constructor = clazz.getConstructor(paramType);
// new一個(gè)object數(shù)組來(lái)存放讀取的數(shù)據(jù)(存放構(gòu)造函數(shù)的參數(shù))
Object[] objs = new Object[paramType.length];
String str = null;
// 沒(méi)有讀到文件的尾部就一直讀取文件
while ((str = br.readLine()) != null) {
// 讀取到的字符串以空格分隔
String[] data = str.split(" ");
for (int i = 0;i < paramType.length;i++) {
// 構(gòu)建構(gòu)造函數(shù)的參數(shù)
Object o = paramType[i].getConstructor(String.class).newInstance(data[i]);
objs[i] = o;
}
// 通過(guò)調(diào)用之前獲取到的構(gòu)造方法來(lái)創(chuàng)建泛型對(duì)象
T t = constructor.newInstance(objs);
list.add(t);
}
// 關(guān)閉文件流
br.close();
return list;
}
利用上面的這個(gè)方法,我們就可以實(shí)現(xiàn)不同類的讀取,只要該類實(shí)現(xiàn)了自己定義的Readable接口,就可以直接通過(guò)該方法讀取文件中的數(shù)據(jù)。(文件中的數(shù)據(jù)一行為一個(gè)類的數(shù)據(jù),數(shù)據(jù)以空格分隔)
使用反射的目的就是為了使帶代碼跟抽象,代碼抽象的好處可以提高代碼的復(fù)用率,減少代碼的冗余。
到此這篇關(guān)于Java利用反射實(shí)現(xiàn)文件的讀取操作的文章就介紹到這了,更多相關(guān)java反射實(shí)現(xiàn)文件讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringMVC中的@RequestMapping注解
這篇文章主要介紹了SpringMVC中@RequestMapping注解,@RequestMapping注解是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于映射一個(gè)請(qǐng)求或一個(gè)方法,可以用在類或方法上,需要的朋友可以參考下2023-07-07
Java 多個(gè)異常共享同一個(gè)異常處理器的方法
這篇文章主要介紹了Java 多個(gè)異常共享同一個(gè)異常處理器的方法,Java 的異常處理機(jī)制,在 Java 7 中有了非常大的改進(jìn)。其中一個(gè)特性就是,支持多個(gè)異常共享同一個(gè)異常處理器。,需要的朋友可以參考下2019-06-06
Java實(shí)現(xiàn)發(fā)送手機(jī)短信語(yǔ)音驗(yàn)證功能代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送手機(jī)短信語(yǔ)音驗(yàn)證功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
IDEA最新版2020.1的maven工程本地依賴倉(cāng)庫(kù)無(wú)法使用問(wèn)題(已解決)
這篇文章主要介紹了IDEA最新版2020.1的maven工程本地依賴倉(cāng)庫(kù)無(wú)法使用問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java使用poi組件導(dǎo)出Excel格式數(shù)據(jù)
這篇文章主要介紹了Java使用poi組件導(dǎo)出Excel格式數(shù)據(jù),需要的朋友可以參考下2020-02-02
解決@ServerEndpoint不能注入@Autowired的問(wèn)題
這篇文章主要介紹了解決@ServerEndpoint不能注入@Autowired的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

