Java 动态代理

1585364631
2023-02-20 / 0 评论 / 120 阅读 / 正在检测是否收录...

Java 动态代理

程序为什么需要代理?

  • 对象如果嫌身上干的事情太多,可以通过代理来转移部分职责
  • 对象有什么方法写被代理,代理就一定要有对应的方法

定义接口

public interface Star {
    String sing(String name);
    void dance();
}

定义继承接口重写类

public class BigStar implements Star{
    private String name;

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

    public String sing(String name){
        System.out.println(this.name + "正在唱" + name);
        return "谢谢!谢谢";
    }

    public void dance(){
        System.out.println(this.name + "正在跳舞");
    }
}

主方法运行

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        Star star = new BigStar("小明");
        /*
            ClassLoader loader,Class<?>[] interfaces,InvocationHandler h
            参数1:用于指定一个类加载器
            参数2:指定生成的代理长什么样子,有哪些方法
            参数3:用来指定生成的代理对象要干什么事情
        */
        Star starProxy = (Star) Proxy.newProxyInstance(BigStar.class.getClassLoader(), BigStar.class.getInterfaces(), (Object proxy, Method method, Object[] args1) -> {
            if (method.getName().equals("sing")){
                System.out.println("准备话筒");
            }else if (method.getName().equals("dance")){
                System.out.println("准备场地");
            }
            return method.invoke(star,args1);
        });
        starProxy.dance();
        String text = starProxy.sing("好日子");
        System.out.println(text);
    }
}

结果输出

准备场地
小明正在跳舞
准备话筒
小明正在唱好日子
谢谢!谢谢
0

评论 (0)

取消