透過ASM 反射實現IOC
大家知道ASM可以來分析 修改類 從前學習spring的時候裡面有個叫IOC的技術,不知道他的底層實現感覺很神秘,
但是最近在看ASM的東西,感覺結合反射用它就可以實現自動注入的功能。例子如下
那spring裡面是如何實現的呢?
// 註解類 package hgs.asm; public @interface AutoWare { } //AnoDesc 裡面的一個屬性 package hgs.asm; public class A { } package hgs.asm; //用於操作的類 public class AnoDesc { String name = "hgs"; int age = 100; @AutoWare A a; public void saySomething(String desc) { System.out.println("say:" + desc); } } //測試 package hgs.asm; import java.io.IOException; import java.lang.reflect.Field; import java.util.List; import org.objectweb.asm.ClassReader; import org.objectweb.asm.Type; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldNode; public class Test { public static void test1() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException { String clazz = "hgs.asm.AnoDesc"; Class<?> forName = Class.forName(clazz); AnoDesc newInstance = (AnoDesc)forName.newInstance(); //透過asm讀取類 透過其屬性api 來訪問類的屬性 方法 註解 ClassNode node = new ClassNode(); //node.superName ="org.objectweb.asm.ClassVisitor"; ClassReader reader = new ClassReader("hgs.asm.AnoDesc"); //ClassWriter writer = new ClassWriter(0); reader.accept(node,0); //node.accept(writer); //得到所有的屬性 List<FieldNode> fields = node.fields; for(FieldNode fnd: fields) { String name = fnd.name; String desc = fnd.desc; Object value = fnd.value; Type tp = Type.getObjectType(desc); System.out.println("name:"+name); System.out.println("desc:"+desc); System.out.println("value:"+value); System.out.println("type:"+tp.getInternalName()); System.out.println(); //判斷屬性是否存在 AutoWare註解 List<AnnotationNode> invisibleAnnotations = fnd.invisibleAnnotations; if(invisibleAnnotations!=null ) { for(AnnotationNode and : invisibleAnnotations) { System.out.println(" anotation:"+and.desc); System.out.println("equals:"+"Lhgs/asm/AutoWare;".equals(and.desc)); //存在的話 就把該屬性初始化 if("Lhgs/asm/AutoWare;".equals(and.desc)) { String qiliName = tp.getInternalName().replaceFirst("L", "").replaceAll("/", "\\.").replace(";", ""); System.out.println("qulity name :"+ qiliName); Class<?> fi = Class.forName(qiliName); Field declaredField = forName.getDeclaredField(name); declaredField.set(newInstance,fi.newInstance() ); } } } } System.out.println(newInstance.a); } public static void main(String[] args) throws Exception{ test1(); } } 結果
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2675782/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 手寫IOC實現過程
- 透過反射對比兩個物件是否相等反射物件
- 透過反射注入去除Spire.Office的PDF水印反射
- 透過API介面實現資料探勘?API
- C# 透過反射(Reflection)呼叫不同名泛型方法C#反射泛型
- eBay透過事件溯源實現持續交付事件
- 如何透過代理IP實現Facebook群控?
- 反射的妙用:C#通過反射動態生成型別繼承介面並實現反射C#型別繼承
- 搞透 IOC,Spring IOC 看這篇就夠了!Spring
- CentOS 7.4上透過keepalive實現Tomcat高可用CentOSTomcat
- 如何透過 Rancher 輕鬆實現多雲部署
- Android 透過scheme跳轉支付寶實現支付AndroidScheme
- 面試:spring ioc實現原理面試Spring
- Spring IOC容器實現機制Spring
- Spring實現IOC容器的兩種實現方式Spring
- java透過反射統計實體類和父類中為空的欄位數量Java反射
- 淺析如何通過PHP類的反射來實現依賴注入PHP反射依賴注入
- org.reflections 介面通過反射獲取實現類原始碼研究反射原始碼
- 如何透過css變數實現主題切換?CSS變數
- 使用自定義註解透過BeanPostProcessor實現策略模式Bean模式
- 透過Keep-Alive實現防抖&節流元件Keep-Alive元件
- Nginx透過https方式反向代理的簡單實現NginxHTTP
- 能源公司 Turcomp 透過 NocoBase 實現敏捷、安全開發敏捷
- C語言透過socket實現TCP客戶端C語言TCP客戶端
- Rainbond透過外掛整合SkyWalking,實現APM即插即用AI
- 005 透過連結串列學Rust之實現DropRust
- golang透過mysql語句實現分頁查詢GolangMySql
- JVM是如何實現反射的JVM反射
- 你必須瞭解的反射——反射來實現實體驗證反射
- 4. Spring對IoC的實現Spring
- 《Spring原始碼分析》IOC的實現Spring原始碼
- c++ web框架實現之靜態反射實現C++Web框架反射
- Rama透過拓撲通用語言實現ACID事務
- 透過Span實現高效能陣列,例項解析陣列
- 如何透過動態引數實現週報製作
- 透過資料結構實現簡易通訊錄資料結構
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 教你如何透過vue實現echarts中的儀表盤VueEcharts