開發四年只會寫業務代碼,分布式高并發都不會還做程式員?->>>
MyBatis-Plus中的LambdaQueryWrapper是如何實作傳入物體方法參考來獲取方法屬性名的?
比如下下代碼:

我很好奇它內部是如何實作獲取 productKey 這個屬性名的。
uj5u.com熱心網友回復:
不多說直接上代碼
//這就是MybatisPlus底層的實作,我只是把它單獨拿出來了
public class MybatisPlusApplicationTests {
@Test
public void test() {
//SerializedLambda物件為MybatisPlus中的一個類可以自行查看
SerializedLambda serializedLambda = getSerializedLambda(Banner::getBannerName);
System.out.println(serializedLambda.getImplMethodName()); //輸出結果為:getBannerName,再做的個簡單的字串截取即可獲得bannerName屬性名
}
public static SerializedLambda getSerializedLambda(SFunction<Banner, ?> lambda) {
SerializedLambda serializedLambda = null;
try {
ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(serialize(lambda))) {
protected Class<?> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException {
Class<?> clazz = super.resolveClass(objectStreamClass);
return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz;
}
};
serializedLambda = (SerializedLambda) objIn.readObject();
} catch (Exception x) {
}
return serializedLambda;
}
public static byte[] serialize(Object object) {
if (object == null) {
return null;
} else {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
} catch (IOException var3) {
throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), var3);
}
return baos.toByteArray();
}
}
}
uj5u.com熱心網友回復:
全部轉換成小寫, 然后classload反射
uj5u.com熱心網友回復:
內部有一個靜態物件維護所有的物體類映射關系
uj5u.com熱心網友回復:
Product::getProductKey 這個拉姆達運算式參考的是一個 Method 型別是
java.lang.reflect.Method
然后它內部可以通過反射取得該名稱,比如 mMethod.getName(),然后取得關聯的屬性和欄位名。
uj5u.com熱心網友回復:
簡單說就是介面回呼
uj5u.com熱心網友回復:
C++ 的運算式,java jvm封裝的,原理與C一樣轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/80725.html
標籤:其他技術討論專區
上一篇:法線紋理生成置換紋理(高度圖)
