MyBatis反射工具

2021-10-21 19:34:40 字數 2758 閱讀 6698

objectfactory是mybatis建立物件的基類,主要通過create建立物件,可以通過有參或者無參構造方法建立物件,此時的物件屬性並沒有初始化。

/**

* 通過無參構造方法建立物件

*/t create(classtype);

/*** 通過有參構造建立物件

*/t create(classtype, list> constructorargtypes, listconstructorargs);

objectfactory的預設實現是defaultobjectfactory,最終通過instantiateclass方法建立物件:

判斷是否存在無參建構函式,存在無參構造直接反射建立物件。

如果構造方法是私有的,通過反射修改訪問限制,再建立物件。

無參構造建立失敗,嘗試通過有參構造建立物件。

private  t instantiateclass(classtype, list> constructorargtypes, listconstructorargs)  catch (illegalacces***ception e)  else }}

constructor = type.getdeclaredconstructor(constructorargtypes.toarray(new class[constructorargtypes.size()]));

try catch (illegalacces***ception e) else

}} catch (exception e)

}

/**

* 獲得指定屬性的值

*/object get(propertytokenizer prop);

/*** 設定指定屬性的值

*/void set(propertytokenizer prop, object value);

建立reflector的工廠類, reflector是mybatis反射模組的基礎,每個reflector物件都對應乙個類,在其中快取了反射操作所需要的類元資訊。

reflector主要是為了建立pojo描述資訊,類似於spring中的beandefinition。

// 建立物件的型別

private final class<?> type;

// get,is方法的屬性

private final string readablepropertynames;

// set,is方法的屬性

private final string writablepropertynames;

// 屬性對應的set方法,key為屬性名,invoker

private final mapsetmethods = new hashmap<>();

// 屬性對應的get方法,key為屬性名

private final mapgetmethods = new hashmap<>();

// 屬性的引數型別

private final map> settypes = new hashmap<>();

private final map> gettypes = new hashmap<>();

// 預設的構造方法

private constructor<?> defaultconstructor;

// 所有屬性的名稱集合

private mapcaseinsensitivepropertymap = new hashmap<>();

reflector資料再構造方法中初始化。

public reflector(class<?> clazz) 

for (string propname : writablepropertynames)

}

/**

* 原始物件

*/private final object originalobject;

/**

* 原始物件的乙個包裝

*/private final objectfactory objectfactory;

private final reflecto***ctory reflecto***ctory;

屬性解析,例如,user[1].linkman.name 被被解析成:

children=linkman.name

indexedname=user[1]

name=user

index=1

// 當前表示式名稱,屬性名

private string name;

// 當前表示式索引名

private final string indexedname;

// 索引下標

private string index;

// 子表示式(屬性裡面的子屬性)

private final string children;

public propertytokenizer(string fullname) else

indexedname = name; // a[0]

delim = name.indexof('[');

if (delim > -1)

}

@test

public void test()

}

Mybatis基礎支援層之反射工具箱

reflector是mybatis中反射模組的基礎,每個reflector物件都有對應乙個類。對應的class型別 private class type getter屬性的名稱集合 private string readablepropertynames empty string array set...

mybatis逆向工具

mybatis逆向工具 1 resource資料夾下建乙個generatorconfig.xml配置檔案,配置檔案的路徑應該與結構樹建立對應包名一致。2 建立乙個執行類main.j a import org.mybatis.generator.config.xml.configurationpars...

java反射 通用的java反射工具

因專案需要,需要反射呼叫安卓系統audiomanager的一些方法,這些方法或者使用 hide標記,或者需要的sdk版本比較高,無法直接呼叫,這個時候,反射就是一大神器了。正常的反射呼叫流程如下 非靜態有返回值方法反射 class clazz class.forname full classname...