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。

参考资料:

java 反射,spring 自动注入原理

时间: 2024-10-13 16:34:19

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

Spring注解自动注入Bean

我们知道采用Spring注解时,配置如下: [html] view plaincopy <context:annotation-config /> <context:component-scan base-package="cn.itkt"></context:component-scan> 这样的话,在com包及其所有子包下的所有类如果含有@Component.@Controller.@Service.@Repository等注解的话都会自动纳入到

SSM-Spring-06:Spring的自动注入autowire的byName和byType

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- di的注入上次讲了一些,这次主要阐述域属性的自动注入 先讲byType方式 看名字就知道是根据类型进行自动注入 案例: 实体类:(俩个,一个学生类,一个汽车类) package cn.dawn.day06autowire; /** * Created by Dawn on 2018/3/5. */ //student类 public class Student { private String name;

Spring中Bean的作用域、Spring的自动注入、在spring配置文件中引入属性文件

1. Bean的作用域 Bean的作用域默认为单例模式. 2. 自动注入 3. 在spring配置文件中引入属性文件 Bean的作用域默认为单例模式. 原文地址:https://www.cnblogs.com/mcl2238973568/p/11478426.html

Spring Boot自动注入原理

启用自动注入 使用注解@EnableAutoConfiguration开启自动注入功能. @EnableAutoConfiguration @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { // ignore... } @AutoConfigurationPackage @Import(AutoConfigurat

spring AutowireCapableBeanFactory 自动注入

文档:http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html public interface AutowireCapableBeanFactoryextends BeanFactory Extension of the BeanFactory interface to be implemented by

spring 需要自动注入的类 可以申明为static 吗?

 @Autowired   private UserInfoService service;   private static UserInfoService service;

Spring容器是如何实现 Bean 自动注入(xml)

入口web.xml web.xml 配置文件 <!-- Spring Config --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</par

Spring框架使用ByName自动注入同名问题剖析

问题描述 ??我们在使用spring框架进行项目开发的时候,为了配置Bean的方便经常会使用到Spring当中的Autosire机制,Autowire根据注入规则的不同又可以分为==ByName==和==ByType==这两种机制(两者的用法和区别可以参考[email protected]官方文档).但大家在使用Autowire当中==ByName==机制的时候有没有思考过这样一个问题,当我们配置了两个name属性相同的Bean,Spring在自动注入的时候会采取怎样处理方式?会覆盖?还是抛出异

spring自动注入是单例还是多例?单例如何注入多例?

单例多例需要搞明白这些问题:      1. 什么是单例多例:      2. 如何产生单例多例:      3. 为什么要用单例多例      4. 什么时候用单例,什么时候用多例:   1. 什么是单例.多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 单例模式和多例模式说明: 1. 单例模式和多例模式属于对象模式. 2. 单例模式的对象在整个系统中只有一份,多例模式可以有