aop动态代理底层实现模拟

UserDAO.java:目标方法

public class UserDAO implements IDAO{
	@Override
	public void save() {
		// TODO Auto-generated method stub
	}
	@Override
	public void select() {
		// TODO Auto-generated method stub
	}
}

Proxy.java:代理类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.lang.reflect.Method;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class Proxy {
	public static void main(String[] args) throws Exception {
		Object proxy=newProxyInstance();
		System.out.println(proxy.toString());
	}

	//传进来方法信息(来自接口,也可以来之目标类)
	//类加载器
	//传进来一个invocationHandler的实现类
	public static Object newProxyInstance() throws Exception {
		// 得到方法信息
		Class classInfo = IDAO.class;
		Method[] methods = classInfo.getMethods();
		for (Method method : methods) {
			System.out.println(method.getName());
		}
		// 生成Proxy1.java
		String method1Name = methods[0].getName();
		String method2Name = methods[1].getName();
		//代理类 save(){调用接口InvocationHandler.invoke()}
		String classContent = "public class Proxy1"
		+ "{public void "+method1Name+"() {} "
				+ "public void "+method2Name+"(){}"
				+ "}";
		String fileString = "d:\\Proxy1.java";
		FileWriter fileWriter = new FileWriter(fileString);
		fileWriter.write(classContent);
		fileWriter.flush();

		// 编译出Proxy1.class
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
		File file = new File(fileString);
		Iterable units = fileManager.getJavaFileObjects(file);
		CompilationTask task = compiler.getTask(null, fileManager, null, null, null, units);
		task.call();
		// 加载Proxy1.class
		ProxyClasLoader clasLoader=new ProxyClasLoader();
		Class proxyClassInfo=clasLoader.findClass("d:\\Proxy1.class");
		// 创建出代理对象,返回
		Object proxy=proxyClassInfo.newInstance();
		return proxy;

	}
	static class ProxyClasLoader extends ClassLoader{
		@Override
		protected Class<?> findClass(String name) throws ClassNotFoundException {
			try {
				FileInputStream inputStream=new FileInputStream(name);
				int length=inputStream.available();
				byte[] classContent=new byte[length];
				inputStream.read(classContent);
				Class classInfo=defineClass(classContent, 0, classContent.length);
				return classInfo;
			} catch (Exception e) {
				// TODO: handle exception
			}
			return null;
		}
	}

}

IDAO.java:目标方法实现的接口

public interface IDAO {
	public void save();
	public void select();

}

图解思路:

原文地址:https://www.cnblogs.com/yunianzeng/p/12302113.html

时间: 2024-11-10 16:16:20

aop动态代理底层实现模拟的相关文章

详解 spring AOP 动态代理

通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下: package my.spring.fuck.aoptest; public interface Interface1 { public void say_hello(); } 很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码: package my.spring.fuck.aoptest; public class MyImple implements Interface1{ @

jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

代理模式是一种很常见的模式,关于底层原理网上看到很多的有关的讲解,但看了一些都觉得比较粗略,很多时候把底层代码copy下来也不大讲解,感觉不如自己详细的写上一篇.本文将以非常详细的说明来分析jdk动态代理底层的实现原理,篇幅较长,但是每个核心方法代码中每步都有说明.还请耐心阅读 1.举例 public class ProxyFactory implements InvocationHandler { private Class target; public <T>T getProxy(Clas

jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

代理模式是一种很常见的模式,关于底层原理网上看到很多的有关的讲解,但看了一些都觉得比较粗略,很多时候把底层代码copy下来也不大讲解,感觉不如自己详细的写上一篇.本文将以非常详细的说明来分析cglib动态代理底层的实现原理,篇幅较长,但是每个核心方法代码中每步都有说明.还请耐心阅读 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency&

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

Spring AOP动态代理

出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法,再对ProxyFactoryBean进行转换 xml文件 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><!--使用cglib动态代理--> <be

.Net 框架实现AOP(动态代理实现AOP,本文为翻译)

在上一节,我们将静态实现AOP,但是对于一个大型项目,要想为每个类,每个方法都去实现AOP ,进行日志记录和权限验证似乎是不可能的. 即使可能对于成百上千个类维护,也是很难维护.所以今天的主题就是如标题所述. (Real Proxy)真正代理和(Dynamic Proxy)动态代理 Real Proxy 类是个抽象类,定义在 System.Runtime.Remoting.Proxies,定义了代理的一些公共的基本的功能方法. Dynamic Proxy 类必须继承Real Proxy,通过重写

AOP动态代理

Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能.最常见的就是事务控制.工作之余,对于使用的工具,不免需要了解其所以然.学习了一下,写了些程序帮助理解. AOP 主要是利用代理模式的技术来实现的. 1.静态代理:就是设计模式中的pr

String Aop 动态代理例子

动态代理原理:spring AOP采用动态代理来实现 (1)定义一个接口Boy package aop001; public interface Boy { public void beat(String time); public void play(String time); } (2)定义两个类实现Boy接口: Boy_1 package aop001; public class Boy_1 implements Boy { @Override public void beat(Strin