博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态代理小例子
阅读量:7132 次
发布时间:2019-06-28

本文共 2672 字,大约阅读时间需要 8 分钟。

  hot3.png

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler {    private Object object;    public Object bind(Object object) {        this.object = object;        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("before say!!");        Object result=method.invoke(object,args);        System.out.println("before say!!");        return result;    }}

接口IspeakInterface

public interface IspeakInterface {    public void say();    public void sing();}

实现类A:

public class SpeakEnglish implements IspeakInterface {    @Override    public void say() {        System.out.println("Hello");    }    @Override    public void sing() {        System.out.println("Merry Christmas!!");    }}

实现类B:

public class SpeakChinese implements IspeakInterface {    @Override    public void say() {        System.out.println("你好!!");    }    @Override    public void sing() {        System.out.println("北京欢迎您!!");    }}

测试类:

public class TestProxy {    public static void main(String[] args) {        DynamicProxy dynamicProxy=new DynamicProxy();        IspeakInterface ispeak=(IspeakInterface)dynamicProxy.bind(new SpeakChinese());        ispeak.say();          ispeak.sing();    }}

这里面最重要的就是代理类,也就是上述的DynamicProxy类,在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。

每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用 一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable
Object invoke(Object proxy, Method method, Object[] args) throws Throwableproxy:  指代我们所代理的那个真实对象method:  指代的是我们所要调用真实对象的某个方法的Method对象args:  指代的是调用真实对象某个方法时接受的参数

Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

public static Object newProxyInstance(ClassLoader loader, Class
[] interfaces, InvocationHandler h) throws IllegalArgumentException

这个方法的作用就是得到一个动态的代理对象,其接收三个参数,我们来看看这三个参数所代表的含义:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了

h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

转载于:https://my.oschina.net/guanhe/blog/842380

你可能感兴趣的文章
url 地址传参 Action中乱码处理
查看>>
软件项目“免坑”指南
查看>>
windows10 使用中的一些问题
查看>>
Python Tkinter编写的一个小程序
查看>>
如何限制IP,通过SSH登陆linux服务器
查看>>
oracle 两表关联的update操作
查看>>
killed
查看>>
Server2008R2远程桌面RDS学习笔记
查看>>
linux查看ip命令--ifconfig
查看>>
Apache安装配置启用
查看>>
(转)ibatis.net读取不到新建的xml文件解决
查看>>
Yii-You are not allowed to access this page
查看>>
Apache Beam官方文档
查看>>
maven导出项目依赖的jar包
查看>>
VIM-ctags对actionscript的支持
查看>>
android入门(5)_设置DataNode的心跳时间
查看>>
Java 基础知识
查看>>
[置顶] 下拉列表选择移动组件(jquery)
查看>>
Mysql配置Spring数据源c3p0与dbcp
查看>>
VMware HA实战攻略之一软硬件环境准备
查看>>