文档章节

java动态代理记录

大胖小胖
 大胖小胖
发布于 2017/02/13 20:45
字数 491
阅读 15
收藏 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
博文 13
码字总数 10237
作品 0
武汉
Android工程师
java提供类与cglib包实现动态代理

终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习。 动态代理有三角色:抽象角色,代理角色,真是角色。 第一个记录下java提供的动态代理。即使用Proxy类和InvocationHandel接...

kyle1970
2012/11/22
0
0
深度探讨Java字节代码的操纵方法

本文为IBM工程师成富编写的《Java深度历险》的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢。 51CTO编者按:我们曾给大...

mj4738
2011/11/02
0
0
动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码。当前有很多开源框架可以完成这些功能,如ASM,Javassist。 动态代理机制详解(JDK 和CGLIB,Javassist,ASM...

素雷
2017/10/19
0
0
Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及...

刘学炜
2012/01/13
0
0
Java 动态代理及 RPC 框架介绍

原文出处:Frapples 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。 python重写函数能够做到这一点,就连世界上最好的语言也提供称...

Frapples
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
32分钟前
1
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
38分钟前
1
0
大数据学习脑图以及入门教程!

近些年,大数据的火热可谓是技术人都知道啊,很多人呢,也想学习大数据相关,所以,这里分享几个大数据脑图,希望可以让你清楚明白从哪里入门大数据,知道该学习以及掌握哪些知识点; 大数据...

董黎明
今天
1
0
聊聊redis的监控工具

序 本文主要研究一下redis的监控工具 redis-stat redis-stat是一个比较有名的redis指标可视化的监控工具,采用ruby开发,基于redis的info命令来统计,不影响redis性能。 docker运行 docker r...

go4it
今天
2
0
TypeScript基础入门之高级类型的索引类型(Index types)

转发 TypeScript基础入门之高级类型的索引类型(Index types) 高级类型 索引类型(Index types) 使用索引类型,编译器就能够检查使用了动态属性名的代码。 例如,一个常见的JavaScript模式是从...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部