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...