Java实现动态代理示例

首先定义一个接口

public interface IStars {

    void sing();

    void dance();
}

其中有两个对应star的方法,dance和sing;

然后定义一个star类来实现这个接口

public class Stars implements IStars {

    private String name;

    public Stars(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void sing() {
        System.out.println(getName() + "唱了一首歌");
    }

    @Override
    public void dance() {
        System.out.println(getName() + "跳了一支舞");
    }
}

这时,需要一个代理类来实现对star类的动态代理,即定义一个代理类

public class StarsNewProxy implements InvocationHandler {

    private Object object;
    

    public StarsNewProxy(Object o){
        this.object = o;
    }

    private boolean runBefore(Method method){
        System.out.println("拦截到代理请求");
        if(method.getName().equals("dance")){
            System.out.println("明星脚受伤了,不能跳舞表演了");
            return false;
        }
        return true;
    }

    private void runAfter(Method method){
        System.out.println(method.getName() + "代理请求完毕");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(!runBefore(method))
            return null;
        Object result = method.invoke(object, args);
        runAfter(method);
        return result;
    }
}

实现InvocationHandler接口,重写invoke方法,其中的method.invoke即是执行这个方法,除此之外还可以在执行这个方法前和方法后定义一些其他的操作,有点类似于AOP的思想。

接下来我们实现一个测试类

public class Test {
    public static void main(String[] args) {
        IStars iStars = new Stars("Frank");
        InvocationHandler handler = new StarsNewProxy(iStars);
        IStars proxy = (IStars) Proxy.newProxyInstance(iStars.getClass().getClassLoader(), iStars.getClass().getInterfaces(), handler);
        proxy.dance();
        proxy.sing();
    }
}

执行结果如下:

本文中的动态代理是通过JDK动态代理机制实现的,必须要先实现业务接口,即IStar接口;然后根据反射机制找到对应的被代理的类,就可以在动态生成的代理类中调用业务实现类的同名方法。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值