文档章节

java动态代理记录

大胖小胖
 大胖小胖
发布于 2017/02/13 20:45
字数 491
阅读 15
收藏 0
点赞 0
评论 0

首先,上代码 BaseJDKProxy.Java

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
  
public abstract class BaseJDKProxy implements InvocationHandler{  
      
    protected Object target;  
  
    public BaseJDKProxy(Object target) {  
        super();  
        this.target = target;  
    }  
      
    @Override  
    public abstract Object invoke(Object proxy, Method method, Object[] args) throws Throwable;  
  
    /** 
     * 获取目标对象的代理对象 
     * @return 代理对象 
     */  
    @SuppressWarnings("unchecked")  
    public <T> T getProxy() {  
        return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),  
                target.getClass().getInterfaces(), this);  
    }  
      
    public void before(){  
        System.out.println("方法执行前操作.......");  
    }  
      
    public void after(){  
        System.out.println("方法执行后操作.......");  
    }  
      
    public void err(Exception e){  
        // 获取抛出异常信息的代码行数  
        System.out.println("调用类:" + Thread.currentThread().getStackTrace()[2].getFileName() + ",行数:" + Thread.currentThread().getStackTrace()[2].getLineNumber());  
        System.out.println("方法执行异常,异常信息:" + e);  
    }  
}  

然后是JDKProxy.java

import java.lang.reflect.Method;  
  
public class JDKProxy extends BaseJDKProxy {  
  
    public JDKProxy(Object target) {  
        super(target);  
        // TODO Auto-generated constructor stub  
    }  
  
    @Override  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        try{  
            before();  
            System.out.println("-------------------------------------------");  
            // 获取代理的方法执行后的返回结果  
            // 执行方法(此处不能直接写proxy,原因自己试试就知道了)  
            Object result = method.invoke(target, args);  
            System.out.println("该方法返回值为:" + result.toString() + "\n-------------------------------------------");  
            after();  
            return result;  
        } catch (Exception e) {  
            err(e);  
        }  
        return null;  
    }  
  
}  

其次就是代理类以及入口相关

public class JDKProxyTest {  
    public static void main(String[] args) {  
        LoginService login = new Login();  
        JDKProxy proxy = new JDKProxy(login);  
        LoginService loginProxy = proxy.getProxy();  
        loginProxy.login();  
    }  
      
}  
  
class Login implements LoginService{  
    @Override  
    public void login() {  
        System.out.println("登录成功");  
    }  
}  
  
interface LoginService{  
    void login();  
}  

运行后输出日志如下: 运行输出: 方法执行前操作.......

登录成功 调用类:JDKProxy.java,行数:24 方法执行异常,异常信息:java.lang.NullPointerException 修改代码为无异常代码输出: 方法执行前操作.......

登录成功 该方法返回值为:方法无返回

方法执行后操作....... 当然,判断方法是否有返回值之类的可以自行在method中寻找,提供了很多种方法,反射相关,这里不提及

以上便是JDK自带的动态代理实现方式,注意点是被代理的类必须实现了接口 当然,这只是给一个方法添加单个动态代理,下一篇再继续讲如何添加多个动态代理(非官方形式)

© 著作权归作者所有

共有 人打赏支持
大胖小胖
粉丝 0
博文 9
码字总数 9388
作品 0
武汉
Android工程师
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 今天 ⋅ 0

JMeter学习-001-JMeter初识

Apache JMeter是Apache组织开发的基于Java的开源压力测试工具(个人发现也可用于接口测试)。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试...

拎壶冲冲冲 ⋅ 05/29 ⋅ 0

3.2 Spring AOP的设计与实现

JVM的动态代理特性 在Spring AOP实现中,使用的核心技术是动态代理,这实际上是JDK的一个特性(JDK1.3以上的版本有这个特性)。通过JDK的动态代理特性,可以为任意Java对象创建代理对象,对于...

edwardGe ⋅ 05/30 ⋅ 0

Spring AOP切点表达式详解

简介 面向对象编程,也称为OOP(即Object Oriented Programming)最大的优点在于能够将业务模块进行封装,从而达到功能复用的目的。通过面向对象编程,不同的模板可以相互组装,从而实现更为...

张旭峰 ⋅ 06/05 ⋅ 2

谈谈字节码增强(一)之java动态代理

最近看到很多人在分享动态代理的实现,想到上次在公司分享过一次字节码增强方面的技术,这里随便写写,做个总结。 什么叫做字节码增强技术? 个人理解,是在Java字节码生成之后,运行期对其进...

一滴水的坚持 ⋅ 06/08 ⋅ 0

集成 Proxy 与 DB Mesh,Sharding-JDBC 3 将"Sharding"做到极致

嘉宾:张亮 作者:雨多田光 提起数据库中间件,我们可以很自然地联想到 OneProxy、TDSQL、Sharding-JDBC 与 MyCat 等知名项目。在众多的数据库中间件实现技术中,通常存在两种架构模式,一种...

编辑部的故事 ⋅ 05/23 ⋅ 18

代码的分离与解耦,向移动架构师进阶!

一、代理概念 为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤...

codeGoogle ⋅ 04/25 ⋅ 0

新浪、百度、好未来3offer到手全记录 | 牛客面经

新浪、百度、好未来3offer到手全记录 牛客面经 原创 2017-09-19 牛友 招聘消息汇总 渣渣的秋招之路 附上新浪,百度,好未来面经 作者:offer快到碗里来?。! 来源:牛客网 楼主是本科渣渣,...

公子只识黛玉 ⋅ 04/17 ⋅ 0

JVM学习总结(一)运行时数据区

《深入Java虚拟机》这本书买了有一段时间了,当时看的时候就只是看,并没有边看边总结啥的,最后发现到脑子里面的根本所剩无几了。现在开始要好好归纳总结地再学习一遍。 运行时数据区域 JV...

hensemlee ⋅ 04/22 ⋅ 0

彻底明白编译型和解释型、动态语言和静态语言区别

编译型和解释型的区别 先来看看编译型语言定义: 编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。 再来看看解释型语言的定义: 解释型语言的源代码不是直接翻译成机...

chenxuxu ⋅ 05/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 13分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 18分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 20分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 23分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 26分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 29分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 32分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 32分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 35分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 36分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部