学习笔记-IOC简单实现(反射)

反射

  • Field
  • Constructor
  • Method
  • Annotation
public class Dog{
    private String color;
    public String name;
    
    
}
public class Test{
    public static void main(String[] args){
       
        // 第一种
        Class dogClass = Dog.class;
        // 第二种
        Class dogClass2 = Clas.forName("xx.Dog");
        // 第三种
        Dog dog = new Dog();
        Class dogClass3 = dog.getClass();
        
        System.out.println(dogClass.getSuperClass().getName());
        System.out.println(dogClass.isInterface());
        Dog dog2 = (Dog)dogClass.newInstance();
     
        
    }
}

Field

public class Test{
    public static void main(String[] args){
       
        // 第一种
        Class dogClass = Dog.class;
        Dog dog = (Dog)dogClass.newInstance();
        
        // 获取所有字段(public)
        Field[] fields  = dogClass.getFields();
        // 获取所有字段
        Field[] fields2 = dogClass.getDeclaredFields();
        
        Field name = dogClass.getField("name"); 
        name.set(dog,"xxx");// 赋值
        System.out.println(name.get(dog));
        
        Field color = dogClass.getDeclaredField("color"); 
        color.setAccessible(true);// 私有属性 暴力注入
        color.set(dog,"red");
        System.out.println(color.getType());
    }
}

Method

  • class.getMethod(“xx”,[String.class,…])
  • class.getMethods()
  • class.getDeclareMethod(“xx”)
  • class.getDeclareMethods()
  • method.invoke(obj,["",…])

Construct

  • class.getConstructor([…])
  • class.getConstructors()
  • construct.newInstance([…])

Annotation

  • class.getAnnotation(xxx.class)
  • class.getDeclareAnnotation(xxx.class)

案例

//反射加载类Person 3种方法
//1
Class clazz = Class.forName("com.sws.Peerson");
//2
Class clazz1 = new Person().getClass();
//3
Class clazz3 = Person.class;
//反射类的构造函数并创建对象
Class clazz = Class.forName("com.sws.Peerson");
//获取无参构造函数
Constructor c1 = clazz.getConstructor(null);
Person p = (Person)c.newInstance(null);
//--------------------
Constructor c2 = clazz.getConstructor(String.class);//获取有参构造函数
Person p = (Person)c.newInstance("name");
//--------------------
//获取有参构造函数
Constructor c3 = clazz.getConstructor(String.class,int.class);
Person p = (Person)c.newInstance("name",12);

//--------------------
//获取有参构造函数
Constructor c4 = clazz.getConstructor(String.class,int.class);
Person p = (Person)c.newInstance("name",12);
//获取私有构造函数,参数为list等类型
Constructor c4 = clazz.getDeclaredConstructor(List.class);
c4.setAccessible(true);//暴力反射,强制访问私有构造函数
Person p = (Person)c.newInstance(new ArrayList());
//反射创建对象另一个方法
Class clazz = Class.forName("com.sws.Peerson");
Person p = (Person)clazz.newInstance();//无参构造函数
Class clazz = Class.forName("com.sws.Peerson");
Person p = (Person)clazz.newInstance();

//--------------------
//反射类的方法
//public void aal()
Method method1 = clazz.getMethod("aal",null);
method1.invoke(p,null);

//--------------------
//public void aal(String name,int password)
Method method2 = 
clazz.getMethod("aal",String.class,int.class);
method2.invoke(p,"name",123);

//--------------------
//public Class[] aal(String name,int[] password)
Method method3 = 
clazz.getMethod("aal",String.class,int[].class);
Class cs[] = 
	(Class[])method3.invoke(p,"name",new int[]{1,2,3});
	
//--------------------
//private void aal(InputStream in)
Method method4 = 
clazz.getDeclaredMethod("aal",InputStream.class);
method4.setAccessible(true);
method.invoke(p,new FileInputStream("c:\\1.txt"));

//--------------------
//private static void aal(int num)
Method method5 = 
clazz.getMethod("aal",int.class);
method5.invoke(null,23);//无需对象

//--------------------
//public static void main(String[] args)
Method method6 = 
clazz.getMethod("main",String[].class);
method6.invoke(null,new Object[]{new String[]{"aa","bb"}});
//method6.invoke(null,(Object)new String[]{"aa","bb"});
Class clazz = Class.forName("com.sws.Peerson");
Person p = new Person();
//反射字段
//--------------------
//public String name="aaa"
Field f = clazz.getField("name");
//获取字段值
Object value  = f.get(p);
//获取字段类型
Class type = f.getType();
if(type.equals(String.class)){
	String svalue = (String)value;
	System.out.println(svalue);
}
//设置字段的值
f.set(p,"name");
System.out.println(p.name);

//--------------------
//反射私有对象
//private int password = 123
Field f1 = class.getDeclaredField("password");
f1.setAccessible(true);
int password = f1.get(p)

//--------------------
//反射私有静态字段
//private static int age = 23;
Field f2 = class.getDeclaredField("age");
f2.setAccessible(true);
int age = f2.get(p)

IOC

原始方法

entity

  • User
public class User implements Serializable{
    private String id;
    private String username;
    private String password;
    private int age;
    // get set
}
  • Book
public class Book implements Serializable{
    private int id;
    private String name;
    // get set
}

dao

  • UserDao
// 查询数据库
// 此处简化
public class UserDao{
    public User findUserById(int id){
        return null;
    }
    public List<User> findaAllUsers(){
        return null;
    }
    public User findUserByUserName(String username){
        return null;
    }
    public void saveUser(User user){
        
    }
}
  • BookDao
// 查询数据库
// 此处简化
public class BookDao{
    public Book findBookById(int id){
        return null;
    }
    
    public List<Book> findAllBooks(){
        return null;
    }
    
    public void saveBook(Book book){
        
    }
}

service

  • UserService
public class UserService{

    private UserDao userDao = new UserDao();
    
    // 登录
    public void login(String username){
        User user = userDao.findUserByUserName(username);
        System.out.println(user.getUserName()+"登录");
    }
    
    // 注册
    public void regist(User user){
        userDao.saveUser(user);
        System.out.println(user.getUserName()+"注册");
    }
}
  • BookService
public class BookService{

    private UserDao userDao = new UserDao();
    private BookDao bookDao = new BookDao();

    public void borrow(User user,Book book){
        System.out.println(user.getUserName()+"借书"+book.getName());
    }
}

UserDao,BookDao被多次重复创建,浪费资源

改进

  • bean.config
# 接口=实现类
# 这里接口省略
xxx.xxx.BookService = xxx.xxx.BookService
xxx.xxx.BookDao = xxx.xxx.BookDao
xxx.xxx.UserService = xxx.xxx.UserService
xxx.xxx.UserDao = xxx.xxx.UserDao
  • ApplicationContext
// 上下文
public class ApplicationContext{

    private HashMap<Class,Object> beanFactory = new HashMap();

    public T getBean(Class clazz){
        return (T)beanFactory.get(clazz);
    }
    
    public void initContext(){
       // 集中实例化 
        //beanFactory.put(UserDao.class,new UserDao());
        //beanFactory.put(BookDao.class,new BookDao());
        //beanFactory.put(UserService.class,new UserService());
        //beanFactory.put(BookService.class,new BookService());
        InputStream resource = ApplicationContext.class.getClassLoader().getResourceAsStream("xxx/bean.config")
        Properties properties = new Properties();
        properties.load(resource);
        Set<Object> keys = properties.keySet();
        for(Object key : keys){
            beanFactory.put(Class.forName(key.toString()),
                Class.forName(properties.getProperty(key).toString()).newInstance());
        }
    }

}
  • BootStrap
// 启动类
public class BootStrap{
    public static void main(String[] agrs){
        ApplicationContext applicationContext = new ApplicationContext();
        applicationContext.initContext();
    }
}

Annotation改进

注解

  • Bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
publlic @interface Bean{
    
}
  • AutoWired
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoWired{
    
}
@Bean
public class BookService{
    @AutoWired
    private UserDao userDao;
    @AutoWired
    private BookDao bookDao;
    
}
@Bean
public class UserService{
    
}
@Bean
public class BookDao{
    
}
@Bean
public class UserDao{
    
}
  • ApplicationContext
// 上下文
public class ApplicationContext{

    private HashMap<Class,Object> beanFactory = new HashMap();

    public T getBean(Class clazz){
        return (T)beanFactory.get(clazz);
    }
  
    public void initContextByAnnotation(){
       load();
       
    }
    private String filePath;
    public static void load(){
        // 编译后的路径
        filePath = ApplicationContext.class.getClassLoader().getResource("").getFile();
        System.out.println(filePath);
        // 加载
        loadOne(new File(filePath));
        // 装配
        assembleObject();
    }
    
    public void assembleObject(){
        // 装配
        for(Map.Entry<Class,Object> entry : beanFactory.entrySet()){
            Object obj = entry.getValue();
            Class<?> aClass = obj.getClass();
            Field[] declaredFields = aClass.geDeclaredFields();
            for(Field field : declaredFields){
                AutoWired annotation = field.getAnnotation(AutoWired.class);
                if(annotation!=null){
                    field.setAccessible(true);
                    field.set(obj,beanFactory.get(field.getType()));
                }
                
            }
        }
    }
    
    private void loadOne(File fileParent){
        // 通过递归查询文件
        if(fileParent.isDirectoru()){
            File[] childrenFiles = fileParent.listFiles();
            if(childrenFiles == null || childrenFiles.length == 0){
                retrun;
            }
            for(File child : childrenFiles){
                if(child.isDirectory()){
                    loadOne(child);
                }else{
                    // filePath 根目录
                    String pathWithClass = child.getAbsoultePath().subString(filePath.length()-1);
                    if(pathWithClass.contains(".class")){
                        String fullName = pathWihClass.replaceAll("\\\\",".")
                        try{
                            Class<?> aClass = Class.forName(fullName);
                         
                            // 判断是否是接口
                            if(!aClass.isIerface()){
                                Bean annotation = aClass.getAnnotation(Bean.class);
                                if(annotation!=null){
                                    Object instance = aClass.newInstance();
                                    beanFactory.put(aClass,instance);
                                }
                               
                            }
                        }catch(Exception){
                            
                        }
                    }
                   
                }
            }
        }
    }
}
  • BootStrap
// 启动类
public class BootStrap{
    public static void main(String[] agrs){
        ApplicationContext applicationContext = new ApplicationContext();
        applicationContext.initContextByAnnotation();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值