基于接口的动态代理

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾。

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的:

普通案例,直接上代码

package proxydemo;

public class actor {
	/*
	 * 方法一,普通演员
	 */
	public void basicActor(float money) {
		System.out.println("给钱干活:"+money);
	}

	/*
	 * 方法二:高危演出
	 */
	public void dangerActor(float money) {
		System.out.println("给钱干活:"+money);
	}

}

  

package proxydemo;

public class client {
	public static void main(String[] args) {
		actor a=new actor();
		a.basicActor(100f);
		a.dangerActor(300f);
	}
}

  以上是普通实现方式,如何基于动态代理实现呢?

package proxydemo;

public interface IActor {
	/*
	 * 方法一,普通演员
	 */
	public void basicActor(float money);

	/*
	 * 方法二:高危演出
	 */
	public void dangerActor(float money);

}

  来个接口,写proxy

package proxydemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class client {
	public static void main(String[] args) {
		actor a=new actor();
//		a.basicActor(100f);
//		a.dangerActor(300f);
		Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(),new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO 自动生成的方法存根
				return null;
			}
		} );
	}
}

  未完待续,

原文地址:https://www.cnblogs.com/rasher/p/10614034.html

时间: 2024-10-15 05:03:07

基于接口的动态代理的相关文章

基于接口和基于子类的动态代理

一:基于接口(JDK1.3之后提供): import com.aiitec.service.IAccountService;import com.aiitec.utils.TransactionManager; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springfra

基于子类的动态代理

package com.itheima.cglib; import com.itheima.proxy.IProducer;import com.itheima.proxy.Producer;import com.sun.webkit.dom.ProcessingInstructionImpl;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.pro

阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理

代理一个普通的java类 导入cglib的包 它还有一个asm的依赖.会自动加进来 创建cglib的文件夹.把proxy里面的Client和Producer复制到cglib文件夹 Producer不实现任何的接口 Client内的代码要重新写 不能受罪种类,如果是最终类就不能再创建子类了 参数1是Class 参数2是Callback MethodInterceptor是Callback的子接口 前面三个参数和基于接口的动态代码参数是一样的 producer需要用final来修饰 调用一下这个方法

Java开发纯接口的动态代理

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 相关类及接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象.// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器static InvocationHandler getInvocationHandler(Object pr

基于JDK的动态代理技术详解

虽然对于Spring的基本思想Aop是基于动态代理和CGlib这一点很早就有所认识,但是什么是动态代理却不甚清楚.为了对Spring加深理解,我觉得好好学习一下java的动态代理是非常有必要的. 静态代理 在学习动态代理之前我先花一点时间了解一下静态代理,从静态代理出发了解代理到底是怎么一回事,以及了解静态代理的局限性,进而明白为什么要发展及使用动态代理技术. 相信使用过Spring框架的同学都知道Spring利用Aop完成声明式事务管理以及其他的代理增强,也就是在方法执行前后加上一些譬如时间.

mybatis源码分析之04Mapper接口的动态代理

在工作中,使用mybatis操作数据库,只需要提供一个接口类,定义一些方法,然后调用接口里面的方法就可以CRUD,感觉是牛了一逼! 该篇就是记录一下,mybatis是如何完成这波骚操作的,即分析我们测试代码的第4行. FemaleMapper femaleMapper = sqlSession.getMapper(FemaleMapper.class); 由上篇可知,sqlSession的真实类型是DefaultSqlSession. 所以,我们直接是看DefaultSqlSession#get

java 动态代理示例,带主要注释

Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interface Subject { String hello(String name); void say();} 接口实现: public class ImpSubject implements Subject { @Override public String hello(String name){ r

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

动态代理看这个就一目了然

动态代理的总结 1.动态代理分类 我们设计一个应用的场景: 以前的导演剧组找演员的时候,直接到家里找这个演员谈价格就可以让他演戏,但是随着时代的发展,出现了经济公司,签约演员. 现在让演员演出就要直接找经济公司,不能找演员. 1.1基于接口的动态代理 // 创建一个演员的角色 public class Actor implements IActor { ? /** * 基本表演 * @param money */ @Override public void basicAct(Float mone