关于java JDK动态代理的浅显理解

来源:互联网 发布:银河战士 知乎 编辑:程序博客网 时间:2024/06/16 03:46

首先我是在用spring AOP的时候才认识到java中的动态代理,在这里我稍微谈一谈我自己对JDK动态代理的理解

首先说明两个问题,在前面我写的文章见过静态代理和动态代理,静态代理如AspectJ而动态代理又有JDK动态代理和CGLib动态代理两种

JDK动态代理是一种接口代理,而CGLib是一种类代理。具体我下面再区分

我以代码实列来讲,先说JDK动态代理,我之前说接口代理可以简单理解就是被代理的类必须是继承了一个接口,所以我们先声明一个接口:

public interface OriginalI {    //测试方法String test();}
而后实现该接口:

public class Original implements OriginalI {public String test(){System.out.println("原测试类!");return "test";}}

下一步编写动态代理类,就是在这个类里面实现织入代码片段

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicP implements InvocationHandler{/* * 需要代理的真实对象 */private Object subject;/**  构造方法*/ public DynamicP(Object subject)    {        this.subject = subject;    }@Override/* * @param org0  最终生成的代理对象 * @param org1 代理对象的某个方法 * @param org2 代理方法的参数 * */public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {// TODO Auto-generated method stubSystem.out.println("前侧环绕!");arg1.invoke(subject,arg2);System.out.println("后侧环绕!");return null;}}

每一个动态代理类都必须继承InvocationHandler该接口

然后是主程序

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class Main {public static void main(String[] args) {// TODO Auto-generated method stub                //需要被代理的对象oriOriginal ori = new Original();                //创建代理实列handlerInvocationHandler handler = new DynamicP(ori);                //代理对象OrI,实现目标类的接口                //OriginalI强制转化为该接口,因为ori.getClass().getInterfaces()获取了被代理对象的所有接口,强制转换至OriginalI接口,就可以调用相关接口方法
OriginalI OrI = (OriginalI)Proxy.newProxyInstance(ori.getClass().getClassLoader()
, ori.getClass().getInterfaces(), handler);OrI.test();OrI.test2();}


相关文档:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html







 
原创粉丝点击