java中的动态代理----自己手动实现
代码使用了common-io,需要其jar
1 接口
- public interface Pruduct {
- void selling();
- }
2 书籍类
- public class Book implements Pruduct {
- @Override
- public void selling() {
- try {
- Thread.sleep(1000);
- System.out.println("books selling.....");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
3 定义日志类
- public class LogTranService{
- public static void before(){
- System.out.println("begin log...");
- }
- public static void after(){
- System.out.println("finish log...");
- }
- }
4 定义时间类
- public class TimeTranService {
- static long bgn;
- public static void before(){
- bgn = System.currentTimeMillis();
- System.out.println("begin time... " + bgn);
- }
- public static void after(){
- long end = System.currentTimeMillis();
- System.out.println("end time... " + (end-bgn));
- }
- }
5 定义InvocationHander
- import java.lang.reflect.Method;
- public interface InvocationHander {
- public void invoke(Object o,Method m);
- }
- import java.lang.reflect.Method;
- public class ProxyHander implements InvocationHander {
- private Object target;
- public ProxyHander(Object target) {
- this.target = target;
- }
- @Override
- public void invoke(Object o, Method m) {
- try {
- TimeTranService.before();
- LogTranService.before();
- m.invoke(target);
- LogTranService.after();
- TimeTranService.after();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
6 代理类
- import java.io.File;
- import java.io.IOException;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Method;
- import javax.tools.JavaCompiler;
- import javax.tools.JavaCompiler.CompilationTask;
- import javax.tools.StandardJavaFileManager;
- import javax.tools.ToolProvider;
- import org.apache.commons.io.FileUtils;
- public class Proxy {
- /*
- * 空的构造函数
- */
- private Proxy(){
- }
- /*
- * 返回代理类
- */
- public static Object newProxyInstance(Class inter,InvocationHander h){
- String proxyClassName = "$Proxy3";
- String packageName = inter.getPackage().getName();
- String InHanderPackage = h.getClass().getPackage().getName();
- String rt = "\r\n";// 换行
- String methodCode = "";
- for (Method method:inter.getMethods()) {
- methodCode+=" @Override"+rt+
- " public void "+ method.getName()+"() {"+rt+
- " try{"+rt+
- " Method method = "+inter.getName()+".class.getMethod(\""
- + method.getName()+ "\");"+rt+
- " h.invoke(this,method); "+rt+
- " }catch(Exception e ){" +rt+
- " e.printStackTrace();" +rt+
- " }"+rt+
- " }";
- }
- /*
- * 总的java代码
- */
- String javaCode=
- "package "+packageName+";"+rt+
- "import "+InHanderPackage+".InvocationHander;"+rt+
- "import java.lang.reflect.Method;"+rt+
- "public class "+proxyClassName+" implements "+inter.getName()+" {"+rt+
- " public "+proxyClassName+"("+InHanderPackage+".InvocationHander h) {"+rt+
- " super();"+rt+
- " this.h = h;"+rt+
- " }"+rt+
- " private "+InHanderPackage+".InvocationHander h;"+rt+
- methodCode+rt+
- "}";
- /*
- * 生成java文件
- */
- // 生成文件路径
- String filename = System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";
- File file = new File(filename);
- try {
- System.out.println(filename);
- FileUtils.writeStringToFile(file, javaCode);// commons-io这个框架可以放很方便的操作文件
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 编译 拿到编译器
- JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
- // 文件管理
- StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
- //获取文件
- Iterable units = fileMgr.getJavaFileObjects(filename);
- // 编译任务
- CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
- // call进行编译
- t.call();
- try {
- fileMgr.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // load到内存
- ClassLoader cl = ClassLoader.getSystemClassLoader();
- try {
- Class c = cl.loadClass(packageName+"."+proxyClassName);
- Constructor ctr = c.getConstructor(InvocationHander.class);
- System.out.println("代理类的名字为:"+c.getName()+"===========");
- return ctr.newInstance(h);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
7 测试
- public class Client {
- public static void main(String[] args) {
- Book book = new Book();
- InvocationHander h = new ProxyHander(book);
- Pruduct m = (Pruduct)Proxy.newProxyInstance(Pruduct.class,h);
- m.selling();
- }
- }
=============仅供参考============
转载于:https://www.cnblogs.com/xm1-ybtk/p/5099325.html
java中的动态代理----自己手动实现相关推荐
- 吃透Java中的动态代理
动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...
- 使用 JAVA 中的动态代理实现数据库连接池
数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...
- Java中的动态代理详解
前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- java动态代理_Java中的动态代理一
方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...
- java 委托_动态代理:Java开发必学
一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...
- Java基础:动态代理
系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...
- Java se之动态代理
转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...
- Java中如何实现代理机制(JDK、CGLIB)
代理分为两种: 1.静态代理 2.动态代理 动态代理又分为两种:jdk 实现 :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...
- 学习spring必须java基础知识-动态代理
2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...
最新文章
- deepin V20 启用Nvidia驱动方法
- 推荐一个牛逼的 GitHub 项目+支付宝、微信支付项目实战!快来获取!
- Brad Wilson写的 ASP.NET MVC 3 Service Location 系列文章索引
- PHP3.2.3 where or,WHERE · ThinkPHP3.2.3完全开发手册 · 看云
- 调整了canvas的高度页面变化后还原_Web 页面录屏实现
- 第一个帖子吧,我也博客了!
- 语言速算24点的小窍门_生活百科,知道这25个实用的居家小窍门,可以为你省去不少麻烦...
- 4符号代码_ELF文件格式解析器 原理 + 代码
- 代码分享:JS判断登陆端是PC还是手机
- Hibernate插入、查询、删除操作 HQL (转)
- mysql sql语句 参数化_MySQL存储过程准备语句(动态SQL)参数化
- Android实现立体滚轮控件,Camera和Matrix实现真正的3D(WheelView)滚轮控件
- J2EE框架技术(SpringMVC) 知识点笔记(2)
- 神舟微型计算机系统重装步骤,神舟笔记本电脑重装系统步骤介绍【图解】
- 日记:2019新年计划,每日计划的思维导图
- 装修以后很快后悔的80件事
- 迎接互联网的明天--玩转3D Web
- 浏览器证书基础介绍和如何测试本地浏览器的HTTPS的完备性
- 吉首大学第八届“新星杯”题解AEGIJK
- 音乐播放器下载音乐需要收费