iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >通过ASM 反射实现IOC
  • 261
分享到

通过ASM 反射实现IOC

2023-06-02 12:06:30 261人浏览 安东尼
摘要

大家知道ASM可以来分析 修改类 从前学习spring的时候里面有个叫ioc的技术,不知道他的底层实现感觉很神秘,但是最近在看ASM的东西,感觉结合反射用它就可以实现自动注入的功能。例子如下那spring里面是如何实现的

大家知道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;@AutoWareA 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();}}结果

通过ASM 反射实现IOC

--结束END--

本文标题: 通过ASM 反射实现IOC

本文链接: https://www.lsjlt.com/news/229990.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 通过ASM 反射实现IOC
    大家知道ASM可以来分析 修改类 从前学习spring的时候里面有个叫IOC的技术,不知道他的底层实现感觉很神秘,但是最近在看ASM的东西,感觉结合反射用它就可以实现自动注入的功能。例子如下那spring里面是如何实现的...
    99+
    2023-06-02
  • SpringBoot实现使用反射模拟IOC和getBean
    IOC就是spring的核心思想之一:控制反转。这里不再赘述,看我的文章即可了解: spring基础思想IOC 其次就是java的反射,反射机制是spring的重要实现核心,今天我看...
    99+
    2023-05-14
    SpringBoot反射模拟IOC SpringBoot反射模拟getBean
  • Java通过反射来打印类的方法实现
    目录一. 案例出发二. 反射方法的分析2.1 反射的方式2.2 修饰符的打印2.3 getDeclaredxxx和getxxx的区别2.4 getSimpleName和getName...
    99+
    2024-04-02
  • SpringBoot如何实现使用反射模拟IOC和getBean
    这篇文章主要介绍“SpringBoot如何实现使用反射模拟IOC和getBean”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何实现使用反射模拟IOC和getBean”文章能帮...
    99+
    2023-07-05
  • 通过反射提取通用结构体值
    本篇文章向大家介绍《通过反射提取通用结构体值》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。问题内容我正在尝试将结构体的所有值提取到字符串切片中。 func structValues(i...
    99+
    2024-04-04
  • 使用Java反射模拟实现Spring的IoC容器的操作
    目录实现的功能:项目结构下面是程序的项目结构图:自定义注解容器实现测试实体类User的定义:实现的功能: 默认情况下将扫描整个项目的文件 可以使用@Componen...
    99+
    2024-04-02
  • golang怎么通过反射创建新对象
    小编给大家分享一下golang怎么通过反射创建新对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!golang适合做什么golang可以做服务器端开发,但gola...
    99+
    2023-06-14
  • golang 如何通过反射创建新对象
    废话少说,直接贴代码~ type A struct { Name string } // 测试unit func TestReflect(t *testing.T) { ...
    99+
    2024-04-02
  • java怎么通过反射获得方法真实参数名
    今天小编给大家分享一下java怎么通过反射获得方法真实参数名的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。示例咱们先来看这样...
    99+
    2023-06-29
  • C#中通过反射将枚举元素加载到ComboBo的实现方法
    目录一、前言二、思路三、上代码一、前言        做过系统参数设置的同学们,肯定遇到过要提供一系列具有相同特点的选项供用户选择。最初级的做...
    99+
    2024-04-02
  • 怎样通过反射获取非静态内部类实例
    目录一、无参构造函数二、有参构造函数总结一、无参构造函数 public class OuterClass { public void process() { ...
    99+
    2023-03-09
    反射实例 非静态内部类 反射非静态内部类
  • java中怎么通过反射获取属性值
    在Java中,可以通过反射来获取属性的值。下面是一个示例代码:```javaimport java.lang.reflect.Fie...
    99+
    2023-09-07
    java
  • Unity 如何通过反射给gameObject添加组件
    C#版本 public static Component AddComponent(GameObject go, string assembly, string classnam...
    99+
    2024-04-02
  • golang反射实现工厂
    在Golang中,反射(reflection)是一种机制,用于检查和操作程序元素的运行时特性,包括类型、结构体、变量和方法等。使用反射,开发者可以根据运行时的需求,动态获取和操作程序的各类数据和对象,这在工厂模式的实现中也非常有用。本文将介...
    99+
    2023-05-15
  • C#反射怎么实现
    本篇内容介绍了“C#反射怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#反射技术主要基于System.Type类和System.R...
    99+
    2023-06-30
  • golang反射实现原理
    Golang是一种简单、高效、并发安全的编程语言。它的反射机制使得程序员可以在运行时获取和修改程序对象的信息,实现动态编程。本文将介绍Golang反射的实现原理,帮助读者更好地理解反射的工作机制和使用方式。一、反射的基础概念反射是一种程序在...
    99+
    2023-05-15
  • 通过反射器指针设置map1和map2的值
    php小编柚子在这里为大家介绍一种使用反射器指针的方法来设置map1和map2的值。通过反射器指针,我们可以方便地访问和修改对象的属性和方法,实现对map1和map2的值的动态设置。这...
    99+
    2024-02-09
  • Java如何通过反射获取Constructor、Field、Method对象
    目录前言使用反射技术获取构造器对象并使用使用反射技术获取成员变量对象并使用使用反射技术获取方法对象并使用总结前言 在实际开发中,通过反射可以得到一个类的完整结构,包括类的构造方法、类...
    99+
    2024-04-02
  • java中怎么通过反射获取字段的值
    通过反射获取字段的值,可以使用Java中的Field类的get()方法。首先,需要获取字段对应的Class对象,然后再通过Class...
    99+
    2023-09-27
    java
  • Java中如何通过反射获取类的信息
    这篇文章主要为大家展示了Java中如何通过反射获取类的信息,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Java中如何通过反射获取类的信息”这篇文章吧。Java的特点有哪些Java的特点有哪些1....
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作