精华内容
下载资源
问答
  • Java反射机制在Spring IOC应用

    万次阅读 多人点赞 2016-10-10 09:48:01
    IOC:即“控制反转”,不是什么技术,而是一种思想。...在Spring的配置文件,经常看到如下配置: 那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器去了了?对,就是通过反射!!! 下面是Spring通过

    IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

    本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。

    在Spring的配置文件中,经常看到如下配置:

    <bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

    那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!

    下面是Spring通过配置进行实例化对象,并放到容器中的伪代码:

    //解析<bean .../>元素的id属性得到该字符串值为“courseDao”
    String idStr = "courseDao";
    //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”
    String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";
    //利用反射知识,通过classStr获取Class类对象
    Class<?> cls = Class.forName(classStr);
    //实例化对象
    Object obj = cls.newInstance();
    //container表示Spring容器
    container.put(idStr, obj);
    通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。


    当一个类里面需要应用另一类的对象时,Spring的配置如下所示:

    <bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
         <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->
         <property name="courseDao" ref="courseDao"></property>
    </bean>
    我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:

    //解析<property .../>元素的name属性得到该字符串值为“courseDao”
    String nameStr = "courseDao";
    //解析<property .../>元素的ref属性得到该字符串值为“courseDao”
    String refStr = "courseDao";
    //生成将要调用setter方法名
    String setterName = "set" + nameStr.substring(0, 1).toUpperCase()
    		+ nameStr.substring(1);
    //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数
    Object paramBean = container.get(refStr);
    //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象
    Method setter = cls.getMethod(setterName, paramBean.getClass());
    //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象
    setter.invoke(obj, paramBean);

    通过上面对Spring底层原理的分析,可以发现,其实并不难,用到的都是反射机制,通过反射实例化对象,存入到Spring的bean容器中。

    只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。




    展开全文
  • java反射在spring中应用

    千次阅读 2015-01-18 22:01:31
    java反射在spring中应用

       1.为什么要用反射?

        根据对象可以得到该类的所有信息,可以做直接操作对象不能做的事,它不是在编译时执行,而是在运行时执行,也就是执行.class时执行,所以它可以做在编译时不能做的事,像hibernate的属性映射就是通过反射来赋值的,spring的bean的创建就是根据配置的class来反射构建的


      2.反射怎么用

         我就不像网上说一大堆理论知识了,直接写个spring注入的例子

        

    <span style="font-size:18px;">public class ReflectDemo
    {
        public static void main(String[] args)
        {
    
            try
            {
                String classPath = "com.chenjun.Compute";// 由spring中bean 的class属性值传进来
    
                Class class1 = Class.forName(classPath); // 这是获得class对象最常用的方式,还有.class,getClass()两种方式
    
                Object object = class1.newInstance();
    
                String attrName = "a";// 代表spring中待注入的属性
                String attrValue = "hello";// 代表spring中待注入的属性值
                Method method = class1.getMethod("set" + attrName.toUpperCase(), String.class);
                method.invoke(object, attrValue);// 调用setter方法为bean注入属性值
    
                System.out.println(object.toString());
    
            }
            catch (SecurityException e)
            {
                e.printStackTrace();
            }
    
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    
    class Compute
    {
    
        private String a;
    
        public String getA()
        {
            return a;
        }
    
        public void setA(String a)
        {
            this.a = a;
        }
    
        @Override
        public String toString()
        {
            return a;
        }
    
    }</span>

    输出:hello,说明注入成功,这个class对应的bean也就创建成功



    展开全文
  • spring 使用反射

    千次阅读 2019-03-12 09:08:48
    通过BeanId 获取Bean package ... import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.Applic...

    通过BeanId 获取Bean 

    package cn.com.kgo.eventhand.util;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    @SuppressWarnings("static-access")
    @Component
    public class ContextUtil implements ApplicationContextAware {
    	private static ApplicationContext commonApplicationContext;
    
    	public void setApplicationContext(ApplicationContext context) throws BeansException {
    		this.commonApplicationContext = context;
    	}
    
    	/**
    	 * 根据提供的bean名称得到相应的服务类
    	 * 
    	 * @param beanId
    	 *            bean的id
    	 * @return 返回bean的实例对象
    	 */
    	public static Object getBean(String beanId) {
    		return commonApplicationContext.getBean(beanId);
    	}
    
    	/**
    	 * 根据提供的bean名称得到对应于指定类型的服务类
    	 * 
    	 * @param beanId
    	 *            bean的id
    	 * @param clazz
    	 *            bean的类类型
    	 * @return 返回的bean类型,若类型不匹配,将抛出异常
    	 */
    	public static <T> T getBean(String beanId, Class<T> clazz) {
    
    		return commonApplicationContext.getBean(beanId, clazz);
    	}
    
    }
    

    通过反射执行Bean的方法

    很多时候使用bean的时候并不能获取到实体对象和接口对象,无法对对象进行转型,这时候只能采用反射的方式执行,Bean的方法。

    获取方法

    Method method = ReflectUtil.getMethod(obj.getClass(), methodName);

    ReflectUtil 是spring 的反射工具类 ,obj 可以是通过上面的方法获取的bean对象,getMethod方法有多个重载,可以声明参数

    执行方法

    第一种方式

    使用java原始的方式

    method.invoke(obj, args);

    method 是反射获取的方法实体,obj为bean 对象,args 是参数。

    第二种方式,也是推荐使用方式

    使用ReflectUtil对象

    ReflectionUtils.invokeMethod(method, obj, args);

    method 方法实体,obj bean实体,args参数

    执行成功返回object对象

     

     

     

     

    展开全文
  • spring反射应用

    2020-02-05 16:51:15
    spring中反射应用 https://blog.csdn.net/mlc1218559742/article/details/52774805 spring解析xml文件拿出bean元素,接着通过反射(newinstance)来创建实例 (此处是根据元素名字用反射找到对应的类) 为...
    • spring中反射的应用

    https://blog.csdn.net/mlc1218559742/article/details/52774805

    spring解析xml文件拿出bean元素,接着通过反射(newinstance)来创建实例

    此处是根据元素名字用反射找到对应的类

    • 为什么要用反射来创建对象呢?

    1. 首先知道耦合,当在一个类里面new出另外一个类,会增加这两个类的耦合度
    2. 而解耦一般用到:a.反射  b.多态  c.工厂模式
    3. 依赖注入提高了解耦性,举例:你要一辆车,自己造一辆(new),出去租一辆(容器中通过反射创建)如果自己造完用一次不用了,就仍在那浪费空间,而汽车厂租的可以还回去,别人能用如果说自己造的别人也能用,那只限于知道你造了汽车的人,但是人人都知道汽车厂可以有汽车
    • spring的松耦合

    spring 解耦https://blog.csdn.net/weixin_41866960/article/details/83994137

    1. 第三方给你依赖的类而不是自己去创建(自己创建会增加耦合性),这是松耦合
    2. spring通过setter或构造方法实现依赖注入
    3. spring的降耦合度主要是  客户端值依赖接口,不依赖实现类,实现类在xml中已经和接口接好了
      <bean id="userManager" class="com.bjpowernode.spring.manager.UserManagerImpl"></bean>
      
      

       

    展开全文
  • Spring中应用反射机制浅析

    千次阅读 2016-05-09 13:56:04
    Spring中应用反射机制浅析 标签: springgetterclasssetterstringexception 2012-06-28 19:30 7479人阅读 评论(4) 收藏 举报  分类:   spring&springMVC(17)  版权声明:本文为...
  • 反射,注解与Spring

    2020-09-16 14:26:06
    Spring Spring的启动过程 调用ContextLoader的初始化方法创建webApplicationContext上下文环境 ...运行时可以知道任意一个类的所有属性,方法,并可以改变他的属性,应用在各种框架 反射的原理 java是一
  • spring中应用反射实例化bean

    千次阅读 2017-10-16 21:56:08
    一 反射源头Class类 对类的概念我们已经非常熟悉了。比如可以有Student这个类,Person这个类。但是我们要知道,有一个叫Class的类,它是反射的源头。   正常方式:通过完整的类名—>通过new实例化—>取得...
  • springboot 使用反射spring注入无效

    千次阅读 2019-05-28 09:36:42
    使用反射的类注入 ApplicationContext, 通过applicationContext.getBea(cls); 从spring中获取bean @Autowired private ApplicationContextapplicationContext; Class<?> cls = Cl...
  • Java反射机制与Spring关系

    千次阅读 2017-12-22 08:43:18
    其实此处的控制指的是程序的一些对象或者变量的控制权,传统的程序中都是由应用程序自己控制对象创建或者变量赋值,这是一种主动式的控制,导致组件之间的完全耦合;现在将一些对象或者变量的创建控制权交给一...
  • Java及spring 注解(反射原理)

    万次阅读 2018-08-14 00:55:28
    java注解:  Java5.0以后引入了注解的概念  注解只源码阶段保留(编译时忽略),不会影响程序内部的东西... 定义一个注解就可以其他类使用 1.元注解:注解上面的注解  (1)@ Retention(...)    ...
  • 文章目录什么是springIoc手写springIoc实现思路 什么是springIoc IOC(Inversion of Control) 意为控制反转,他是一种设计思想.并非实际的技术.最核心的思想就是将对象实例创建的控制权交给程序(IOC 容器) IOC 容器: ...
  • 今天项目遇到一个由于Java反射调用Bean方法而导致Spring特性失效的问题,折腾了半天,现给出解决方案。 1、抛出问题 我要控制器的某个方法通过反射调用一个service的方法,但是这个方法已经被纳入切面同时...
  • Spring中IOC用到的反射机制

    千次阅读 2017-10-10 22:40:49
    IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计...在Spring的配置文件,经常看到如下配置: 那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器去了了?对,就是通过反
  • Java 反射机制是运行状态,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射...
  • Java 反射在实际开发应用

    万次阅读 2018-09-25 10:28:23
    目录 一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 ... 二:JavaRTTI  2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTTI运行时如何表示 2.3 : ...
  • 首先来看看使用反射来获取注解名: 只需获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import javax.persistence.Table; annotation.name()...
  • 本篇文章其实没有特别的主题,好像都涉及到那么一点,包括IOC、反射、bean等等,就往下看吧,或许你也会有跟我一样的感觉:某个时刻豁然开朗~ 1.hello接口 2.业务类 3.测试类 4.运行结果 ...
  • 反射机制概念 我们考虑一个场景,如果我们程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?... 我们.java文件编译后会变成.class文件,这就像是个镜面,本身是.java,是.class,他...
  • 在Spring Framework(版本低于5.2.3的5.2.x,版本5.1.13的5.1.x和版本5.0.16的5.0.x)应用程序受到攻击时很容易受到反射文件下载(RFD)攻击响应设置“ Content-Disposition”标头,其中filename属性是从...
  • 单例模式私有化了构造方法,所以其他类无法使用通过new的方式去创建对象,其他类使用该类的实例时,只能通过getInstance去获取。但是可以通过Constructor反射的方式获取私有化的构造器然后通过构造方法去创
  • 关于最基础的Ioc的概念及其思想,我们 Spring核心功能–Ioc一节中都有过详细的讨论,这里就不多言了! 1、java反射 那么,接下来,我们从反射入手,开始Spring征程。看例子: package com.smart.reflect;...
  • 文章目录Spring 反射调用类的@Autowired注解服务空指针错误代码错误日志解决方案 Spring 反射调用类的@Autowired注解服务空指针 错误代码 反射代码 // 反射调用对应服务函数并传递参数 Class serviceClass = ...
  • 今天项目遇到一个由于Java反射调用Bean方法而导致Spring特性失效的问题,折腾了半天,现给出解决方案。 1、抛出问题 我要控制器的某个方法通过反射调用一个service的方法,但是这个方法已经被纳入切面同时该...
  • Spring 反射工具类ReflectionUtils

    万次阅读 2014-11-26 10:03:35
    ReflectionUtils这个反射工具类有几个工具方法,首先介绍几个控制访问权限的方法makeAccessible 它由3个重载,分别是对属性,方法和构造 属性 public static void makeAccessible(Field field) { ...
  • Spring入门第一讲——Spring框架的快速入门

    万次阅读 多人点赞 2017-04-08 00:27:34
    Spring的概述什么是Spring据度娘所载: Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架...Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson其著作Exp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,691
精华内容 30,276
关键字:

反射在spring中的应用

spring 订阅