美文网首页
(反射+内省机制的运用)简单模拟spring IoC容器的操作

(反射+内省机制的运用)简单模拟spring IoC容器的操作

作者: 一乐乐 | 来源:发表于2022-02-24 12:43 被阅读0次

简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】

  • 实体类Hello
package com.shan.hello;

public class Hello {
    private String password;
    private String username;
    
    private Hello() {};
    
    public Hello(String username) {
        this.username = username;
    }
    
    

    public void setPassword(String password) {
        this.password = password;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public void printUser() {
        System.out.println("hello " + username + ", your password is " + password);

    }
}

1、实例Hello对象-反射常用的方法,调用Class类中的newInstance();

  • 但是SpringIoC容器中必须存在一个和访问权限无关的无参构造器(例如Hello中的构造器可以是public,也可以是private)
  • 实体类Hello
public class Hello {
    private String password;
    private String username;
    
    private Hello() {};//无参构造器,可以是public,也可以是private,与访问权限无关

所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象Hello

        String className = "com.shan.hello.Hello";
        Hello hello = null; 
        //================================
        //实例Hello对象-反射常用的方法,调用Class类中的newInstance();
//      Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
        //所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
        //反射机制获取构造器
        Class clazz = Class.forName(className);
        Constructor con = clazz.getDeclaredConstructor();
        con.setAccessible(true);//设置构造器的可访问性
        Object obj = con.newInstance();
        hello = (Hello)obj;

✿ 2、完整模拟IoC容器代码如下:

    //简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】
    @Test
    void testIoCMock() throws Exception {
        String className = "com.shan.hello.Hello";
        Hello hello = null; 
        //================================
        //实例Hello对象-反射常用的方法,调用Class类中的newInstance();
//      Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
        //所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
        //反射机制获取构造器
        Class clazz = Class.forName(className);
        Constructor con = clazz.getDeclaredConstructor();
        con.setAccessible(true);//设置构造器的可访问性
        Object obj = con.newInstance();
        hello = (Hello)obj;
        //内省机制操作javaBean属性
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            //当前的属性的属性名
            String propertyName = pd.getName();
            if("username".equals(propertyName)) {
                pd.getWriteMethod().invoke(hello,"shan");
            }else if("password".equals(propertyName)) {
                pd.getWriteMethod().invoke(hello, "123");
            }   
        }
        
        hello.printUser();
    }


写在后面的话

       如果你觉得一乐的文章给您带来了一些收获,可以给个三连❤️ ,一乐会一如既往地更新有价值的博客。如果文章存在错误,也欢迎大家指出。还有,如果大家有什么好的学习技巧、学习感悟,也非常欢迎大家在评论区一起交流~

最后感谢大家的支持,谢谢~

相关文章

网友评论

      本文标题:(反射+内省机制的运用)简单模拟spring IoC容器的操作

      本文链接:https://www.haomeiwen.com/subject/vzyzlrtx.html