spring aop学习6:jdk动态代理(基于接口代理)

一.jdk动态代理(只能代理实现了接口的类)
1.通过:java.lang.reflect.Proxy类来生成动态代理对象
2.代理类需要实现java.lang.reflect.InvocationHandler接口
3.只能用于基于接口实现的动态代理

二.代码
1.动态代理接口:InterfaceObject.java:

package jdk.dynamic.proxy;
//代理接口,最终通过此接口调用动态生成的代理类实现
public interface InterfaceObject {

    public String targetMethod(String str);

    public String targetMethod2(String str);

}

2.目标类:TargetObject.java (实现动态代理接口)

package jdk.dynamic.proxy;
//目标类
public class TargetObject implements InterfaceObject{

    //方法1
    @Override
    public String targetMethod(String str) {
         System.out.println("目标对象的方法1");
        return str;
    }

    //方法2
    @Override
    public String targetMethod2(String str) {
         System.out.println("目标对象的方法2");
        return str;
    }

}

3.自定义实现InvocationHandler接口的类:MyInvocationHandler.java

package jdk.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//实现InvocationHandler以便Proxy动态生成代理类
public class MyInvocationHandler implements InvocationHandler{

    //目标类
    private TargetObject targetObject;

    public MyInvocationHandler(TargetObject targetObject){
        this.targetObject = targetObject;
    }

    //重写invoke方法,Proxy动态生成代理类的时候会调用此方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("前置:before");
        Object result = null;
        try {
            //使用方法反射调用目标对象方法
            result = method.invoke(targetObject, args);

            System.out.println("返回通知:AfterReturning");
        } catch (Exception e) {
            System.out.println("异常通知:AfterThrowing");
        }finally{
            System.out.println("后置通知:After1");
        }
        System.out.println("后置通知:After2");
        return result;
    }

}

4.测试main方法:

package jdk.dynamic.proxy;

import java.lang.reflect.Proxy;

//测试类
public class UseExec {

    public static void main(String[] args) {
        //通过java.lang.reflect.Proxy类来生成动态代理对象
        //Proxy.newProxyInstance(当前类加载器, 动态代理接口的数组, 代理类);

        //当前类加载器
        ClassLoader classLoader = UseExec.class.getClassLoader();
        //动态代理类 的Class对象数组
        Class[] classes = {InterfaceObject.class};
        //实现InvocationHandler的自定义类
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(new TargetObject());

        //动态生成代理类(动态代理接口的实现类)
        InterfaceObject interfaceObject =  (InterfaceObject) Proxy.newProxyInstance(classLoader, classes, myInvocationHandler);
        //调用动态代理类的接口
        interfaceObject.targetMethod("你好");
        interfaceObject.targetMethod2("你好2");
    }

}


运行结果:
前置:before
目标对象的方法1
返回通知:AfterReturning
后置通知:After1
后置通知:After2
前置:before

目标对象的方法2
返回通知:AfterReturning
后置通知:After1
后置通知:After2

可见,jdk动态代理,无论目标对象的方法有多少,代理对象始终只通过一个invoke方法动态生成所有代理方法!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值