java的反射原理与Spring的自动注入

Java反射原理与Spring的自动注入

反射的定义

java的反射机制就是在运行状态中,

  1. 对于任意一个类都能够知道这个类的所有属性和方法;
  2. 对于任意一个对象,都能够调用它的任意一个方法和属性。

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Sping的自动注入原理

一个Bean的类:

public class User{

    private String username;
    private String mobile;

    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username = username;
    }

    public String getMobile(){
        return mobile;
    }
    public void setMobile(String mobile){
        this.mobile = mobile;
    }

}

驱动类:

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class ReflectionTest {
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String[] args) throws Exception {
        //id 为自己指定的值
        String id = "user";
        Map<String, Object> context = new HashMap<String, Object>();  
        //这里是通过User.class.getName()获取类名,通用的作法是通过配置文件获取类名
        //三种方法,可以获得类名
        //1. User.class.getName()
        //2. new User().getName()
        //3. Class.forName("User").getName()
        Class c = Class.forName(User.class.getName());
        Object object = c.newInstance(); 
        // 模拟spring容器  
        context.put(id, object);
        Method method = c.getDeclaredMethod("setUsername", String.class);
        // setter注入 
        method.invoke(object, "xiaoqiang");
        System.out.println(((User) object).getUsername());
    }
}

对反射定义的理解代码

在运行状态中,

对任意一个类,都能够知道这个类的所有方法和属性

代码示例如下:

import java.lang.reflect.Field; 
import java.lang.reflect.Method;

public class ReflectionTest {
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) throws Exception {
        Class c = Class.forName(User.class.getName());
        System.out.println("------------------------------------");
        //获取所有User类下面定义的所有的方法
        Method method[] = c.getDeclaredMethods();
        for(int i=0;i<method.length;i++){
            System.out.println(method[i].getName());
        }
        System.out.println("------------------------------------");
        //获取所有User类下面定义的所有的属性
        Field f[]=c.getDeclaredFields();
        for(int i=0;i<f.length;i++){
            System.out.println(f[i].getName());
        }
        System.out.println("------------------------------------");
        //获取所有User类下面定义的所有的方法以及父类的方法
        Method method1[] = c.getMethods();
        for(int i=0;i<method1.length;i++){
            System.out.println(method1[i].getName());
        }
        System.out.println("------------------------------------");
        //获取所有User类下面定义的所有的属性以及父类的属性
        Field f1[]=c.getDeclaredFields();
        for(int i=0;i<f1.length;i++){
            System.out.println(f1[i].getName());
        }
    }
}

对于任意一个对象,都可以调用它的任一属性和方法

代码实例如下:

import java.lang.reflect.Field;

public class ReflectTest{
    public static void main(String[] args) throws Exception {
    Class c = Class.forName(User.class.getName());
    Object obj = c.newInstance();
    Field field = c.getDeclaredField("username");
    field.setAccessible(true);
    field.set(object,"hehe");
    System.out.println((User)object.getUsername());
    }
}

此时,username被设置为hehe。

参考资料:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。