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();
    }
}

执行结果如下:

Java实现动态代理示例_第1张图片

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

你可能感兴趣的:(Java实现动态代理示例)