最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用反射實(shí)現(xiàn)文件的讀取操作

 更新時(shí)間:2021年02月04日 14:33:31   作者:DGrain  
這篇文章主要介紹了Java利用反射實(shí)現(xiàn)文件的讀取操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

java反射

java從很早的版本開始就引入了反射機(jī)制,java如今的框架底層大部分也都是使用反射實(shí)現(xiàn)的。
這篇博客就去探索下java反射使用的方便之處。

要說java的反射機(jī)制,肯定離不開Class這個(gè)類,我們從jdk的源碼可以看到這個(gè)類在jdk1.0的時(shí)候就存在了。

class

由于我這邊需要用到文件讀寫的功能,同時(shí)又希望寫的方法相對來說比較抽象,能在多出直接使用,于是我就想到了java的反射機(jī)制。

首先這邊先把我的讀取文件的方法展示出來

這個(gè)是用到的接口類

/**
 * 實(shí)現(xiàn)該接口中的方法,本來打算在FileUtils中調(diào)用該方法來生成實(shí)體對象,現(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對象添加到List中
  * @param tailPath 文件的名字(須帶擴(kuò)展名)
  * @param clazz List中存儲(chǔ)對象的Class對象
  * @param paramType 所存入的對象的構(gòu)造函數(shù)的參數(shù)的Class對象(該構(gòu)造函數(shù)不能被private或protect修飾)
  * @param <T> List中的泛型,也就是List中存儲(chǔ)對象的類型
  * @return 通過讀取文件所得到的List對象
  * @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是我自己寫的一個(gè)順序表,可直接替換成java提供的ArrayList
  MyList<T> list = new MyArrayList<>();
  // 通過方法傳入的class和參數(shù)列表獲取類的構(gòu)造方法
  Constructor<T> constructor = clazz.getConstructor(paramType);
  // new一個(gè)object數(shù)組來存放讀取的數(shù)據(jù)(存放構(gòu)造函數(shù)的參數(shù))
  Object[] objs = new Object[paramType.length];
  String str = null;
  // 沒有讀到文件的尾部就一直讀取文件
  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;
   }
   // 通過調(diào)用之前獲取到的構(gòu)造方法來創(chuàng)建泛型對象
   T t = constructor.newInstance(objs);
   list.add(t);
  }
  // 關(guān)閉文件流
  br.close();
  return list;
 }

利用上面的這個(gè)方法,我們就可以實(shí)現(xiàn)不同類的讀取,只要該類實(shí)現(xiàn)了自己定義的Readable接口,就可以直接通過該方法讀取文件中的數(shù)據(jù)。(文件中的數(shù)據(jù)一行為一個(gè)類的數(shù)據(jù),數(shù)據(jù)以空格分隔)

使用反射的目的就是為了使帶代碼跟抽象,代碼抽象的好處可以提高代碼的復(fù)用率,減少代碼的冗余。

到此這篇關(guān)于Java利用反射實(shí)現(xiàn)文件的讀取操作的文章就介紹到這了,更多相關(guān)java反射實(shí)現(xiàn)文件讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解SpringMVC中的@RequestMapping注解

    詳解SpringMVC中的@RequestMapping注解

    這篇文章主要介紹了SpringMVC中@RequestMapping注解,@RequestMapping注解是一個(gè)用來處理請求地址映射的注解,可用于映射一個(gè)請求或一個(gè)方法,可以用在類或方法上,需要的朋友可以參考下
    2023-07-07
  • RabbitMQ在Spring Boot中的使用步驟

    RabbitMQ在Spring Boot中的使用步驟

    在Spring Boot中使用RabbitMQ涉及多個(gè)步驟,包括配置、創(chuàng)建監(jiān)聽器和發(fā)送消息,下面給大家分享RabbitMQ在Spring Boot中的使用步驟,感興趣的朋友一起看看吧
    2024-07-07
  • JAVA8 十大新特性詳解

    JAVA8 十大新特性詳解

    本教程將Java8的新特新逐一列出,并將使用簡單的代碼示例來指導(dǎo)你如何使用默認(rèn)接口方法,lambda表達(dá)式,方法引用以及多重Annotation,之后你將會(huì)學(xué)到最新的API上的改進(jìn),比如流,函數(shù)式接口,Map以及全新的日期API
    2014-03-03
  • Java ClassLoader類加載器基礎(chǔ)詳解

    Java ClassLoader類加載器基礎(chǔ)詳解

    這篇文章主要為大家介紹了Java ClassLoader類加載器基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java 多個(gè)異常共享同一個(gè)異常處理器的方法

    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àn)證功能代碼實(shí)例

    Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送手機(jī)短信語音驗(yàn)證功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • java線程之線程的生命周期的使用

    java線程之線程的生命周期的使用

    本篇文章介紹了,java線程之線程的生命周期的使用。需要的朋友參考下
    2013-05-05
  • IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題(已解決)

    IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題(已解決)

    這篇文章主要介紹了IDEA最新版2020.1的maven工程本地依賴倉庫無法使用問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java使用poi組件導(dǎo)出Excel格式數(shù)據(jù)

    Java使用poi組件導(dǎo)出Excel格式數(shù)據(jù)

    這篇文章主要介紹了Java使用poi組件導(dǎo)出Excel格式數(shù)據(jù),需要的朋友可以參考下
    2020-02-02
  • 解決@ServerEndpoint不能注入@Autowired的問題

    解決@ServerEndpoint不能注入@Autowired的問題

    這篇文章主要介紹了解決@ServerEndpoint不能注入@Autowired的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

南安市| 定西市| 蓬溪县| 仙游县| 巴中市| 大荔县| 和田县| 新源县| 蒙自县| 沧源| 台东县| 石景山区| 龙井市| 曲阜市| 金门县| 青河县| 汶川县| 浙江省| 三都| 旬阳县| 玛多县| 内江市| 响水县| 元氏县| 大冶市| 游戏| 张家界市| 昆山市| 龙陵县| 南和县| 丹巴县| 融水| 临海市| 洪雅县| 城市| 汝南县| 丘北县| 三江| 杭锦旗| 鹤峰县| 洪江市|