spring(二)-反射、动态代理

主要是对上一篇文章中涉及到的点做补充,欢迎指正!

1、  java反射知识-Spring IOC 依赖注入

  Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

  Java中有个继承至Object类的Class类,其对象用于表达Java程序运行时的所有类和接口,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。【可以理解为一个类就是一个Class对象

  Java语言允许通过程序化的方式间接对Class对象进行操作,Class文件由类加载器在编译期装载后,在方法区中将形成一份描述Class对象结构的元信息数据,在堆中生成一个指向该元信息数据的Class对象,通过Class对象可以获知.class结构信息:如构造函数、属性和方法等。

  Java允许用户借由这个Class对象间接调用其功能,这就为使用程序化方式操作Class对象开辟了途径。

  反射优势在于:当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,如果使用非反射,则需要修改代码,重新编译和运行,耗时耗资源。

            

            

2、  java动态代理-Spring AOP

  为其他对象提供一种代理以控制对这个对象的访问。实质就是将你要使用的类,重新生成一个子类或本类,这样框架就可以利用这个新生成的类做一些事情,比如在该类的方法前后加一些代码。这样的话,不用修改任何已经编写好的代码,只要使用代理就可以灵活的加入任何东西,将来不喜欢了,不用也不会影响原来的代码。动态代理是设计模式当中代理模式的一种。

  JDK 1.3以后,Java提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy用来动态创建一个代理对象的类。

  每一个动态代理类handler都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler, 当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。通过 Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,


public interface PersonDao {

public void say();

}

public class PersonDaoImpl implements PersonDao{

@Override

public void say() {System.out.println("time to eat");}

}

public class PersonHandler implements InvocationHandler {

private Object obj;

public PersonHandler(Object obj){this.obj=obj;}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

System.out.println("before");

      // args表示say函数所需要的实际参数

Object result = method.invoke(obj, args);

System.out.println("after");

return result;

}

}

public class PersonTest {

@Test

public void test(){

PersonDao pDao = new PersonDaoImpl();

PersonHandler handler = new PersonHandler(pDao);

PersonDao proxy = (PersonDao)Proxy.newProxyInstance                 (pDao.getClass().getClassLoader(),

                pDao.getClass().getInterfaces(),

                handler);

proxy.say();

}

}

原文地址:https://www.cnblogs.com/xiongchang95/p/8966632.html

时间: 2024-07-30 09:59:38

spring(二)-反射、动态代理的相关文章

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

Spring AOP --JDK动态代理方式

我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinition对象并且由BeanDefinitionHolder对象持有.在这个过程中,如果Bean需要被通知切入,BeanDefinition会被重新转换成一个proxyDefinition(其实也是一个BeanDefinition对象,只不过描述的是一个ProxyFactoryBean).ProxyFa

用spring aop实现动态代理的例子

下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 1 package aop007_ComPrint; 2 3 public interface Print { 4 5 public void ColorPrint(); //彩色打印 6 public void WhitePrint(); //黑白打印 7 } 然后定义两个实现类,分别实现彩色打印和黑白打印 1 package aop007_ComPrint; 2 3 p

反射,动态代理随笔

反射的基本概述 一个class文件被加载到内存的时候,JVM就会经行解剖,把这个class文件的所有成员全部解剖出来,然后JVM会创建一个Class对象,把这些成员信息全部都封装起来,所谓反射就是指:我们获取到这个Class对象,就相当于获取到了该类的所有成员信息,我们就能操又该类的所有成员. Java反射机制是在运行状态中,对于任意一个类,都能够知道这类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的细心以及动态调用它的任意一个方法和属性; 这种动态获取

java 反射 动态代理

在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原生实现AOP中 的方法拦截功能.正如英文单词reflection的含义一样,使用反射API的时候就好像在看一个Java类在水中的倒影一样.知道了Java类的内部 结构之后,就可以与它进行交互,包括创建新的对象和调用对象中的方法等.这种交互方式与直接在源代码中使用的效果是相同的,但是又额

【Java核心技术】类型信息(Class对象 反射 动态代理)

1 Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息.Class对象就是用来创建所有"常规"对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似类型转换这样的操作. 每个类都会产生一个对应的Class对象,也就是保存在.class文件.所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类.Class对象仅在需要的时候才会

设计模式(二) 动态代理

1.1.动态代理 在程序运行时,运用反射机制在内存中动态创建代理对象,其实现的功能是与静态代理的功能是类似的,都是增强目标对象额外的功能操作,扩展目标对象.只不过是实现的方法不一致而已. 1.2.动态代理实现的要求 1)代理对象,不需要实现与目标一样的接口: 2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型); 3)  动态代理, JDK代理或者接口代理: JDK中生成代理对象的API:Proxy       stati

java 代理模式二:动态代理

java动态代理: java动态代理类位于java.lang.reflect包下,一般主要涉及两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法:Object invoke(Object proxy,Method method,Object[] args) 第一个参数obj一般是代理类,method是被代理的方法,如上例中的request(),  args是该方法中的参数数组,无参是为null 这个抽象方法在代理类中动态实现. 2.Proxy prot

SSM-Spring-09:Spring中jdk动态代理

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- JDK动态代理: 为何叫JDK动态代理呢? 所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获