通过ASM 反射实现IOC
大家知道ASM可以来分析修改类从前学习spring的时候里面有个叫IOC的技术,不知道他的底层实现感觉很神秘,
但是最近在看ASM的东西,感觉结合反射用它就可以实现自动注入的功能。例子如下
那spring里面是如何实现的呢?
//注解类packagehgs.asm;public@interfaceAutoWare{}//AnoDesc里面的一个属性packagehgs.asm;publicclassA{}packagehgs.asm;//用于操作的类publicclassAnoDesc{Stringname="hgs";intage=100;@AutoWareAa;publicvoidsaySomething(Stringdesc){System.out.println("say:"+desc);}}//测试packagehgs.asm;importjava.io.IOException;importjava.lang.reflect.Field;importjava.util.List;importorg.objectweb.asm.ClassReader;importorg.objectweb.asm.Type;importorg.objectweb.asm.tree.AnnotationNode;importorg.objectweb.asm.tree.ClassNode;importorg.objectweb.asm.tree.FieldNode;publicclassTest{publicstaticvoidtest1()throwsIOException,ClassNotFoundException,InstantiationException,IllegalAccessException,NoSuchFieldException,SecurityException{Stringclazz="hgs.asm.AnoDesc";Class<?>forName=Class.forName(clazz);AnoDescnewInstance=(AnoDesc)forName.newInstance();//通过asm读取类通过其属性api来访问类的属性方法注解ClassNodenode=newClassNode();//node.superName="org.objectweb.asm.ClassVisitor";ClassReaderreader=newClassReader("hgs.asm.AnoDesc");//ClassWriterwriter=newClassWriter(0);reader.accept(node,0);//node.accept(writer);//得到所有的属性List<FieldNode>fields=node.fields;for(FieldNodefnd:fields){Stringname=fnd.name;Stringdesc=fnd.desc;Objectvalue=fnd.value;Typetp=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(AnnotationNodeand:invisibleAnnotations){System.out.println("anotation:"+and.desc);System.out.println("equals:"+"Lhgs/asm/AutoWare;".equals(and.desc));//存在的话就把该属性初始化if("Lhgs/asm/AutoWare;".equals(and.desc)){StringqiliName=tp.getInternalName().replaceFirst("L","").replaceAll("/","\\.").replace(";","");System.out.println("qulityname:"+qiliName);Class<?>fi=Class.forName(qiliName);FielddeclaredField=forName.getDeclaredField(name);declaredField.set(newInstance,fi.newInstance());}}}}System.out.println(newInstance.a);}publicstaticvoidmain(String[]args)throwsException{test1();}}结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。