aop动态代理底层实现模拟
Posted yunianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); }
图解思路:
以上是关于aop动态代理底层实现模拟的主要内容,如果未能解决你的问题,请参考以下文章