java反射机制中的动态代理

java反射机制中的动态代理

动态代理模式及其使用

步骤1:定义一个接口

//接口

interface Subject{

void action();

}

步骤2:定义一个接口的实现类,也就是被代理类

//被代理类

class RealSubject implements Subject {

@Override

public void action() {

System.out.println("我是被代理类,请执行我");

}

}

步骤3:定义一个实现InvocationHandler接口的实现类,也就是代理类

//动态代理类

class MyInvocationHandler implements InvocationHandler {

Object obj;//实现了接口的被代理类的对象的声明

/*

* blind()方法的作用:

* 一、给被代理的对象实例化(就是赋值)

* 二、返回一个代理类的对象

*

* newProxyInstance()方法的三个参数作用:

* 第一个参数:被代理类的类加载器

* 第二个参数:被代理类的接口

* 第三个参数:实现了InvocationHandler接口的类对象

*/

public Object blind(Object obj){

this.obj = obj;

return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);

}

/*

* 当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的invoke()方法的调用

*/

@Override

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

throws Throwable {

//returnVal:method()方法的返回值

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

return returnVal;

}

}

完成以上3步,就可以直接创建一个main()方法来实现上面的动态代理了,这个也非常简单,代码如下:

public class TestDynamicProxy {

public static void main(String[] args) {

// 1.创建一个被代理类的对象

RealSubject real = new RealSubject();

// 2.创建一个实现了InvocationHandler接口的类的对象

MyInvocationHandler handler = new MyInvocationHandler();

// 3.调用blind()方法,动态的返回了一个同样实现了real所在类的接口的代理类对象

Object obj = handler.blind(real);

Subject sub = (Subject) obj;// 此时sub就是代理类的对象

// 4.代理类对象调用action()方法

sub.action();// 转到对InvocationHandler接口的实现类的invoke()方法的调用

}

}

动态代理就这么简单,希望对你有所帮助。

时间: 2024-12-08 17:56:53

java反射机制中的动态代理的相关文章

java反射机制应用之动态代理

1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类.当调用代理类的实现的抽象方法时,就发起对被代理类同样方法的调用. 涉及到的技术点: ①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法 ②Proxy.newProxyInstance(obj.getClass().g

java 反射之静态and动态代理

首先说一下我们什么情况下使用代理? (1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强. (2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 .那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻

利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换

作者:54dabang 在spring的学习过程之中,我们可以看出通过配置文件来动态管理bean对象的好处(松耦合 可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合). Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件中的类对象.Java动态加载类主要是为了不改变主程序代码,通过修

一文带你了解Java反射机制

想要获取更多文章可以访问我的博客?-?代码无止境. 上周上班的时候解决一个需求,需要将一批数据导出到Excel.本来公司的中间件组已经封装好了使用POI生成Excel的工具方法,但是无奈产品的需求里面有个合并单元格的要求,工具类中找了半天也没发现适用的方法,就只能自己撸起袖子干了.导出Excel的工具方法会少不了使用反射,但是反射这东西对于我这种写业务代码的人来说接触比较少,所以就恶补了一下,写下这篇文章记录一下. 什么是反射 万物究其根,研究一样新东西,首先我们需要了解它是什么,干什么用的.在

java反射机制剖析(二)— Class Loader

上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是其中之一.本篇博客就详细的对ClassLoader做一个相对深入的了解.作为了解需要知道的是,其实类类型(Class Class)是和ClassLoader分不开的,因为ClassLoader需要的信息是由它提供的.类类型将在下一篇博客介绍. 简介 ClassLoader是负责加载类的对象,作用是根据Jvm请求提供的类信息,将请求的类加载的内存中或者说加载到Jvm中.另外,每一个类的Class对象(注意

java反射机制与动态代理

在学习HadoopRPC时,用到了函数调用,函数调用都是采用的java的反射机制和动态代理来实现的,所以现在回顾下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机制是java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射就是把Java类中的各种成分映射成相应的Java类. Java反射机制主要提供了以下功能: 1

Java反射机制剖析(四)-深度剖析动态代理原理及总结

动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程. $Proxy0生成的代码如下: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; impo

简谈Java 反射机制,动态代理

谈谈 Java 反射机制,动态代理是基于什么原理?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造.群里也有小编整理的2019年最新最全的java高阶学习资料! 反射机制 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力.可以在运行时通过提供完整的"包名+类名.class"得到某个对象的类型. 功能 在运行时能判断任意一个对象所属的

java中的动态代理机制

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.下面通过代码来学习java中的动态代理技术. 首先定义一个接口: package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public interface Perform { public void play(); } 实