java实现JDK动态代理
来源:互联网 发布:农村电子商务淘宝惠 编辑:程序博客网 时间:2024/05/16 18:16
1:创建一个接口HelloWorld
package dynamicproxy;public interface HelloWorld { //首先定义一个接口,产生代理对象。真实对象为实现类。 void sayHello(); void sayHelloString(String s);}
2:创建实现了代理对象(接口)的真实对象SayHelloWorld ,ImpHelloWorld
package dynamicproxy;public class SayHelloWorld implements HelloWorld { //实现了代理对象的真实对象。 public void sayHello() { // TODO Auto-generated method stub System.out.println("Hello World"); } public void sayHelloString(String s){ System.out.println(s+"Hello World"); }}package dynamicproxy;public class ImpHelloWorld implements HelloWorld{ public void sayHello() { // TODO Auto-generated method stub System.out.println("imp Hello World"); } public void sayHelloString(String s) { // TODO Auto-generated method stub System.out.println(s+"imp Hello World"); }}
3:建立代理对象和真实对象之间的绑定关系和逻辑方法 JDKDynamicProxy implements InvocationHandler
package dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理逻辑类必须实现 InvocationHandler * @author admin * @version 1.0 * */public class JDKDynamicProxy implements InvocationHandler { Object target=null; /** * 建立代理对象和真实对象的代理关系,并返回代理对象 * @param target真实对象 * @return 返回代理对象 */ public Object bind(Object target) { //动态代理绑定 // TODO Auto-generated method stub this.target=target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 代理方法逻辑 * @param proxy代理对象 * @param method 当前调度方法 * @param args 当前方法参数 * @return 代理结果返回 * @throws Throwable 异常 */ public Object invoke(Object proxy, Method method, Object[] args) //代理逻辑实现 throws Throwable { System.out.println("进入代理逻辑方法"); System.out.println("在调度真实对象之前的服务"); Object obj=method.invoke(target, args); //相当于调用sayHello,调用真实对象 //target.invoke;相当于真实对象调用方法 System.out.println("在调度真实对象之后的服务"); return obj; }}
4:主函数调用
package dynamicproxy;public class DynamicProxy { /** * 动态代理: * 1,定义一个接口,作为代理对象 * 2,创建真实对象(可以有多个),实现代理对象。里面有真实对象要做的事情(方法) * 3,创建实现了InvocationHandler的对象,该对象进行了动态代理绑定,和代理逻辑实现, * 逻辑实现里面在真实对象方法前后可以加入代理对象自己的逻辑。 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub JDKDynamicProxy jdk=new JDKDynamicProxy(); //创建实现了InvocationHandler的对象。 //该对象进行了动态代理绑定,和代理逻辑实现 //绑定关系,因为挂在接口HelloWorld下,所以声明对象HelloWorld proxy, HelloWorld proxy=(HelloWorld)jdk.bind(new SayHelloWorld()); //HelloWorld代理了其实现类SayHelloWorld //此时HelloWorld对象已经是一个代理对象,它会进入代理逻辑方法invoke里 HelloWorld proxy1=(HelloWorld) jdk.bind(new ImpHelloWorld()); proxy.sayHello(); //当前调度方法,调用整个invoke方法,里面也含有代理对象自己的逻辑。 proxy.sayHelloString("String"); proxy1.sayHello();//会进入代理逻辑invoke里,把这个方法调用放在Object obj=method.invoke(target, args); //相当于真实对象调用sayHello()。但是前后加上了动态代理的逻辑。 //obj说明有些函数可能会有返回值 proxy1.sayHelloString("String"); }}
5:输出结果:
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务
6:结构图:
阅读全文
0 0
- java实现JDK动态代理
- 模拟JDK动态代理 ; 自己动手模拟实现java动态代理
- Java动态代理-JDK自带实现
- JDK动态代理实现
- jdk动态代理实现
- 实现jdk动态代理
- jdk动态代理实现
- jdk实现动态代理
- JDK实现动态代理
- JDK动态代理实现
- 动态代理--java jdk
- java jdk动态代理
- Java JDK动态代理
- java jdk 动态代理
- Java JDK 动态代理
- java jdk动态代理
- Java JDK 动态代理
- Java-JDK动态代理
- Java——序列化与反序列化
- 爬虫实战9—基于page rank的顺序调整
- 网页中获取微信粉丝信息
- phpmyadmin安装后无法打开的问题(已解决)
- Hibernate的增删查改(分页+其他查询)
- java实现JDK动态代理
- 图片上传前预览演示
- java23种设计模式之策略模式
- ubuntu下 PHP调用rabbitmq
- qwe
- 参加阿里的Java面试经验
- HDU-2389-Rain on your Parade [二分匹配][Hopcroft-Carp]
- 日志分析
- 逆序的三位数