java实现JDK动态代理
2017-08-24 08:53
417 查看
1:创建一个接口HelloWorld
2:创建实现了代理对象(接口)的真实对象SayHelloWorld ,ImpHelloWorld
3:建立代理对象和真实对象之间的绑定关系和逻辑方法 JDKDynamicProxy implements InvocationHandler
4:主函数调用
5:输出结果:
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务
6:结构图:
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:结构图:
相关文章推荐
- 设计模式之动态代理(Java的JDK动态代理实现)
- Core Java:使用java.lang.reflect实现JDK动态代理的小DEMO
- Java 基于JDK中的InvocationHandler实现动态代理
- Java的动态代理实现(JDK默认和CGLIB)
- Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理
- Java JDK 动态代理使用及实现原理分析
- Java反射之JDK动态代理实现简单AOP
- 深入理解java动态代理的两种实现方式(JDK/Cglib)
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- Java 代理模式-JDK动态代理-实现对请求中文乱码的处理
- Java反射之JDK动态代理实现简单AOP
- Java反射之JDK动态代理实现简单AOP
- 分析动态代理Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK动态代理(AOP)的实现原理与使用详析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java动态代理-JDK自带实现
- JAVA JDK的动态代理反射实现
- 模拟JDK动态代理 ; 自己动手模拟实现java动态代理
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)