码迷,mamicode.com
首页 > 编程语言 > 详细

java的反射原理与Spring的自动注入(转载)

时间:2015-05-26 23:28:24      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

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。

参考资料:

java 反射,spring 自动注入原理

java的反射原理与Spring的自动注入(转载)

标签:

原文地址:http://www.cnblogs.com/shitoujizu/p/4531951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!