1. 程式人生 > >學習筆記-註解+反射讀取Bean中資料

學習筆記-註解+反射讀取Bean中資料

我們經常有從資料來源(即javabean中拿資料)的需要,但不同的人對bean中內容的命名五花八門,但利用註解+反射可以寫出通用的提取資料的程式碼。

假設需求是:從一個bean中取出NodeId, NodePId, NodeName三個成員。

假如一個bean是這樣寫的:getset方法省略

public class FileBean {
	private int id;
	private int pId;
	private String label;}

還有一個是這樣:
public class OrgBean {

	private int _id;
	private int parentId;
	private String name;   
}

它們的命名方式有所區別。

下面建立三個註解,對應三個成員:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NodeId {
	
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NodePId {
	
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NodeName {
	
}
在上面的bean中添上對應的註解:
public class OrgBean {
	@NodeId
	private int _id;
	@NodePId
	private int parentId;
	@NodeLabel
	private String name;
}

寫一個方法獲取資料:
public static <T> List<Node> convertDataToNode(List<T> data) throws IllegalAccessException, IllegalArgumentException {
		//將資料都存入Node中
		List<Node> nodes = new ArrayList<Node>();
		Node node = null;
		
		for (T t : data) {
			Class clazz = t.getClass(); //獲取bean的class
			int id = -1;
			int pId = -1;
			String label = "";
			//拿到類中所有Field
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				//通過註解拿到相應成員
				field.setAccessible(true);  //成員是私有的,設定強制獲取
				if(field.getAnnotation(NodeId.class)!=null) {
					id = field.getInt(t);
				}
				if(field.getAnnotation(NodePId.class)!=null) {
					pId = field.getInt(t);
				}
				if(field.getAnnotation(NodeLabel.class)!=null) {
					label = (String) field.get(t);
				}
			}
			//將資料存入node
			node = new Node(id, pId, label);
			nodes.add(node);
		}
這樣一來,無論javabean中的成員怎麼命名,都可以順利地將資料轉入node中了。


相關推薦

學習筆記-註解+反射讀取Bean資料

我們經常有從資料來源(即javabean中拿資料)的需要,但不同的人對bean中內容的命名五花八門,但利用註解+反射可以寫出通用的提取資料的程式碼。 假設需求是:從一個bean中取出NodeId, NodePId, NodeName三個成員。 假如一個bean是這樣寫的:g

python學習筆記——(2)pandas資料型別

    在用python進行資料處理的時候,自帶的五種資料型別使用起來顯然是有侷限性的,python之強大在於各種包,在資料處理中用的最多的就是pandas和numpy。本文章主要介紹pandas的資料結構。     pandas有兩種資料結構  

C++學習筆記-利用rapidJSON讀取JSON資料

JSON檔案如下: { "errorCode":0, "reason":"OK", "result": {"userId":10086,"name":"中國移動"}, "numbers":[110,120,119,911] } 目錄結構如下:

Javascript高階程式設計學習筆記(三)—— JS資料型別(1)

 前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不

Python學習筆記(4)——Matplotlib的annotate(註解)的用法

在上一篇博文ID3決策樹演算法中,繪製決策樹時,使用了Matplotlib的註解工具annotate,藉此機會系統學習一下annotate的用法。 annotate用於在圖形上給資料新增文字註解,而且

資料結構與演算法學習筆記之 提高讀取效能的連結串列(上)

前言   連結串列(Linked list)比陣列稍微複雜一點,在我們生活中用到最常見的應該是快取,它是一種提高資料讀取效能的技術,常見的如cpu快取,瀏覽器快取,資料庫快取等。今天我們就來學習一下連結串列 正文 一、連結串列的定義? 1.一種線性表(資料排成像一條線一樣的結構。每個線性表上的資料最多

Python資料分析學習筆記——DataFrame(還在更新)

pandas的官方文件 1.DataFrame DataFrame是一個表格型的資料結構,它含有一組有序的列,每列可以是不同的值型別(數值、字串、布林值等)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)。 DataFrame可以通過類

java反射學習筆記(2)----java的靜態載入類和動態載入類

首先我們要了解java中的編譯和執行的兩個概念,我們在初學java的時候都學過,我們會先寫一個Test.java檔案,然後javac Test.java,最後在java Test 。這其中的java

python學習筆記--列印巢狀list每個資料(遍歷列表)

遍歷new_list列表中元素 new_list = ["H1","H2",1999] for each_list in new_list: print (each_list); 若列表中包含巢狀列表,怎樣處理? 笨方法:判斷列表中元素是不是列表;並繼續使用f

sqlite學習筆記7:C語言使用sqlite之打開數據庫

實例 clas details code 返回 pri san filename stdlib.h 數據庫的基本內容前面都已經說得差點兒相同了。接下看看如何在C語言中使用sqlite。 一 接口 sqlite3_open(const char *filename, s

sqlite學習筆記11:C語言使用sqlite之刪除記錄

false done mta ase rom real not null -a ubun 最後一節,這裏記錄下怎樣刪除數據。 前面全部的代碼都繼承在這裏了,在Ubuntu14.04和Mac10.9上親測通過。 #include <stdio.h> #in

sqlite學習筆記9:C語言使用sqlite之插入數據

name article void num mes cut cpp content int 前面創建了一張表,如今給他插入一些數據。插入數據跟創建表差點兒相同,不過SQL語言不一樣而已,完整代碼例如以下: #include <stdio.h> #inclu

【lua學習筆記】——2在sublime配置Lua運行環境

author command ges () 作者 ctrl+ bindings text inf 一、讓Sublime可以運行lua腳本 打開sublime 選擇tools-->Build System-->New Build System 在新出現的文件中

vue2.0學習筆記之webpack-simple模板的路由簡單配置案例

nbsp 主頁 default code vue 兩個文件 new ebp 命名 以下是完成後的目錄結構 案例基礎是已經用 webpack+vue-cli 創建了一個名為 vue_router的工程 , 並安裝了vue-rout

Spring 學習筆記(五)—— Bean之間的關系、作用域、自動裝配

mar byname pps etc 有時 sysman 對象實例 構造 encoding 繼承   Spring提供了配置信息的繼承機制,可以通過為<bean>元素指定parent值重用已有的<bean>元素的配置信息。 <?xml

spring學習筆記(3)——bean配置細節註意

collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class

Unity Shader入門精要學習筆記 - 第16章 Unity的渲染優化技術

也會 檢測 特點 著色器 版本 切換 代碼優化 學習 順序 轉自馮樂樂的 《Unity Shader 入門精要》 移動平臺的特點 為了盡可能一處那些隱藏的表面,減少overdraw(即一個像素被繪制多次),PowerVR芯片(通常用於ios設備和某些Android設備)使用

Python學習筆記21(讀取配置文件)

文件 class strong color () for 新的 -i .config 1、基本的讀取操作 -read(filename) 直接讀取文件內容 -sections() 得到所有的sectio

Mysql DBA 高級運維學習筆記-DML之修改表的數據實戰

chan mat 可能 local ceshi 指定 防止 warn 發的 9.10 修改表中的數據 9.10.1 修改表中指定條件固定列的數據 1.命令語法:update 表名 set 字段=新值,….where 條件(一定要註意條件) 2.修改指定的行字段的內容 a.查

14.swoole學習筆記--異步讀取文件

分享圖片 swoole png ima 技術 dir blog log src <?php //異步讀取文件 swoole_async_readfile(__DIR__."/1.txt",function($filename,$content){ echo