基于接口的动态代理

Posted rasher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于接口的动态代理相关的知识,希望对你有一定的参考价值。

在学习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;
			}
		} );
	}
}

  未完待续,

 

以上是关于基于接口的动态代理的主要内容,如果未能解决你的问题,请参考以下文章

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

java-动态代理

Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

深挖JDK动态代理

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