1、静态代理
package staticProxy; public interface Person { public void say(); } package staticProxy; public class Chinese implements Person { public void say() { System.out.println("I am chinese."); } } package staticProxy; public class ChineseProxy implements Person { private Chinese chinese; public ChineseProxy(Chinese chinese) { this.chinese = chinese; } public void say() { System.out.println("Before say..."); chinese.say(); System.out.println("After say..."); } } package staticProxy; public class Test { public static void main(String[] args) { Chinese chinese = new Chinese(); Person p = new ChineseProxy(chinese); p.say(); } }
输出:Before say...
I am chinese.
After say...
2、JDK动态代理
package dynamicProxy; public interface Person { public void say(); } package dynamicProxy; public class Chinese implements Person { public void say() { System.out.println("I am chinese."); } } package dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public Object bind(Object target) { this.target = target; // 取得代理对象 // 必须绑定接口,对于没有实现接口的类无法使用,cglib会弥补这个不足 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { Object result = null; System.out.println("Before say..."); result = arg1.invoke(target, arg2); System.out.println("After say..."); return result; } } package dynamicProxy; public class Test { public static void main(String[] args) { Chinese chinese = new Chinese(); Person p = (Person) new DynamicProxy().bind(chinese); p.say(); } }
输出:Before say...
I am chinese.
After say...
3、CGLIB实现的动态代理,不需要实现接口
需要使用委托类的派生出子类,因此,不支持final修饰的最终类
package cglibProxy; public class Chinese{ public void say() { System.out.println("I am chinese."); } public void eat() { System.out.println("Eating..."); } } package cglibProxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { private Object target; public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("Before say..."); arg3.invokeSuper(arg0, arg2); System.out.println("After say..."); return null; } } package cglibProxy; public class Test { public static void main(String[] args) { Chinese chinese = (Chinese) new CglibProxy().getInstance(new Chinese()); chinese.say(); chinese.eat(); } }
输出:Before say...
I am chinese.
After say...
Before say...
Eating...
After say...
相关推荐
java反射与动态代理
早期自学java代理知识笔记
Java SE 6新特性:Instrumentation,利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决...
这个是个人做的JAVA实现动态代理的笔记
Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多线程、Java常用类、集合(重点)、IO流、GUI图形界面、网络编程、正则表达式、反射、注解、类加载器、动态代理等等,另外还包括银行管理...
16-Java代理模式的学习笔记1
java语言反射与动态代理学习笔记
《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍 《java jdk 7学习笔记》是作者多年来教学实践经验的总结...
代理简介,静态代理,动态代理,23种设计模式之一,拦截器在在流行的开源框架中很常见,依赖的技术就是Java的动态代理。 理解拦截器的核心原理对理解这些开源框架的体系结构至关重要。 下面以一个简单的模型的...
031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义...
JAVA,设计模式动态代理,学习笔记。
Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 2. Java基础语法、类型转换、运算符、Scanner 3. 分支结构、循环结构、随机数 4. 数组详解、Debug工具...
NULL 博文链接:https://whp0731.iteye.com/blog/343787
在学习java面向过程中,关于AOP代理这块,当时思路不是很清晰,借鉴了很多资料进行了解,后面把自己的一些见解整理成浅显的笔记进行加深印象,现在把它分享给学习AOP代理思路的朋友们,希望我的一点浅显的总结能够...
1.有一定JAVA编程基础,希望快速提升技术水平。 2.有一定项目开发经验,希望从事物联网行业应用开发的程序员。 课程内容: 1.MQTT协议 2.EMQ Dashboard 3.EMQ认证 4.日志与追踪 5.发布订阅ACL 6.WebHook 7.管理监控...
108. Shortcut when printing from a Java Agent 278 109. Lotus Script: Write # statement 279 110. Lotus Script: Input # statement 280 111. 使用代理生成 XML 284 112. 使用视图生成 XML 286 113. 执行算术...
动态代理及其生成的代理类,可以反编译查看其类的结构。
通过带着读者从java基础到java编写spring全家桶框架面试以及技术讲解,例如:集合,数组,JVM,引用类型,IO/NIO,多线程,类加载机制,spring设计原理等内容实现。 适合人群:具备一定编程基础,工作3-5年的研发...
《Java多线程核心技术》读书笔记 JDK源码 Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架源码解读(3)——LinkedHashMap Java集合框架源码解读(4)——...