文档章节

java动态代理记录

大胖小胖
 大胖小胖
发布于 2017/02/13 20:45
字数 491
阅读 18
收藏 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零基础进阶之路

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

MFrank
06/21
0
0
以此之长,补彼之短----AOP(代理模式)

上文中提到代理分为静态代理和动态代理,采用代理是为了通过不修改源代码的情况下给程序动态统一添加功能,利用代理技术可以将业务逻辑中一些非业务逻辑的代码分离出来,把他们独立到业务逻辑...

Kerry_Han
2013/08/30
0
0
深度探讨Java字节代码的操纵方法

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

mj4738
2011/11/02
0
0
Java动态代理之InvocationHandler最简单的入门教程

网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,...

JerryWang_SAP
10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之集成工作流Activiti5.22(42)

声明:该博客主要是Springboot1.X和Springboot2.X集成Activiti5.22版本,并说一下两个版本的搭建不同的地方 技术:Springboot2.0.3+mysql+jpa(自动生成25张表)+Activiti5.22 /然后Springboo...

木九天
4分钟前
0
1
windows环境下搭建rabbitMQ开发环境

windows环境下搭建rabbitMQ开发环境 下载与安装 erlang rabbitmq 是使用erlang语言开发的,所以需要erlang环境; 下载地址 rabbitmq 下载地址 rabbitmq与erlang版本关系 下载之后直接安装即可...

晨猫
15分钟前
0
0
JVM 中的守护线程

特点 通常由JVM启动 运行在后台处理任务,比如垃圾回收等 用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。 判断线程是否为守护...

小刀爱编程
19分钟前
1
0

参考 极客时间《数据结构与算法之美》

grace_233
32分钟前
2
0
谈谈KMP算法

KMP算法的资料网上已经一大把了,主要用来解决某个文本片段是否包含另一个子串问题。这里假设文本片段的长度n大于子串长度m,如: 文本串为ABCDABGHIJK 子串为 ABCDABE 在传统的暴力解法中当...

FAT_mt
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部