栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用 InvocationHandler 接口 实现动态代理,实现自定义功能的动态增减

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用 InvocationHandler 接口 实现动态代理,实现自定义功能的动态增减

InvocationHandler 接口位于 java.lang.reflect 反射包,搭配使用可以实现比较丰富的动态功能增减。

直接上代码:

一:必须有准备实现动态代理的Interface功能接口

public interface RunMethodInterface {
    void runA();

    void runB();
}

二:接口的实现类


public class RunMethod implements RunMethodInterface {

    @Override
    public void runA() {
        System.out.println("RunMethod runA...");
    }

    @Override
    public void runB() {
        System.out.println("RunMethod runB...");
    }
}

三:InvocationHandler 接口的自定义实现,主要在这里实现自定义的功能

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.UndeclaredThrowableException;


public class GbxInvocationHandler implements InvocationHandler {

    
    private Object object;

    
    public GbxInvocationHandler(Object object) {
        this.object = object;
    }

    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = null;
        try {
            //执行目标方法前执行的任意逻辑
            System.out.println("GbxInvocationHandler 方法前执行的自定义逻辑...");

            //实现代理的对象方法执行
            invoke = method.invoke(object, args);

            //执行目标方法后执行的任意逻辑
            System.out.println("GbxInvocationHandler 方法后执行的自定义逻辑...");
        } catch (Exception e) {
            System.out.println("GbxInvocationHandler 方法执行异常:" + e.getMessage());
            e.printStackTrace();
        }
        return invoke;
    }
}

四:调用方式

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class TestA {
    public static void main(String[] args) {
        RunMethodInterface runMethod = new RunMethod();
        runMethod.runA();
        runMethod.runB();
        System.out.println("============================分割线============================");
        //开始构建自定义代理
        InvocationHandler gbxInvocationHandler = new GbxInvocationHandler(runMethod);
        //成功创建目标对象的代理
        RunMethodInterface proxyRunMethod = (RunMethodInterface) Proxy.newProxyInstance(gbxInvocationHandler.getClass().getClassLoader(), runMethod.getClass().getInterfaces(), gbxInvocationHandler);
        //用代理对象调用相关方法,则执行目标方法和自定义代理中的相关逻辑
        proxyRunMethod.runA();
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        proxyRunMethod.runB();
    }
}

五:查看程序执行结果

RunMethod runA...
RunMethod runB...
============================分割线============================
GbxInvocationHandler 方法前执行的自定义逻辑...
RunMethod runA...
GbxInvocationHandler 方法后执行的自定义逻辑...
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GbxInvocationHandler 方法前执行的自定义逻辑...
RunMethod runB...
GbxInvocationHandler 方法后执行的自定义逻辑...

Over!

发布前,看到扯淡的官方提示,说质量低,不会获得推荐。好吧,能看到此博文的皆是有缘之人!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号