Java动态代理实现

动态代理

简介:

Java中动态代理应用广泛,例如Spring 的AOP思想: 将通用的横切面 插入到 业务逻辑中就用到了动态代理(eg:日志打印)。

实现方式:

1.实现InvokeHandler接口,在其中的Invoke方法中对被代理对象的方法添加增强行为。

被代理类:

// 接口用于声明代理可以增强那些方法
public interface People {
    public void say();
    public void run();
}
//被代理类
public class ChinesePeople implements People{
    @Override
    public void say() {
        System.out.println("Chinese people say");
    }
    @Override
    public void run() {
        System.out.println("Chinese people run");
    }
}

增强处理:

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

public class PeopleInvokeHandler implements InvocationHandler {

    private People people;

    /**
     * 创建时可以传入被代理的类
     * @param people
     */
    public PeopleInvokeHandler(People people){
        this.people = people;
    }

    /**
     * 中途也可以换代理的对象
     * @param people
     */
    public void setPeople(People people){
        this.people = people;
    }

    /**
     * 在被代理的对象执行之前或者之后添加一些行为
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       //代理前 ,这里可以做一些日志打印之类的工作
        System.out.println(" before proxy invoke ");

        //执行被代理的方法
        method.invoke(people,args);

        //代理后 ,也可以做一些日志打印的工作
        System.out.println("after proxu invoke ");
        return null;
    }
}

2.通过Proxy类创建出原有被代理对象的代理对象,并调用其增强后的方法

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

public class Client {

    public static  void main(String s []){
        //被代理对象
        People people = new ChinesePeople();

        InvocationHandler handler = new PeopleInvokeHandler(people);

        /**
         * 创建代理对象
         * 1.类加载器
         * 2.要代理的接口 只会代理此接口声明的方法
         * 3.代理方法增强处理handler
         */
        People proxyPeople = (People) Proxy.newProxyInstance(handler.getClass().getClassLoader(),people.getClass().getInterfaces(),handler);

        //由此后proxyPeople执行原有被代理(people)的方法,将会被添加一些前置或者后置行为
         proxyPeople.run();
         proxyPeople.say();
    }
}

执行结果:

before proxy invoke 
Chinese people run
after proxu invoke 

 before proxy invoke 
Chinese people say
after proxu invoke 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值