动态代理:创建、工作流程演示

发布时间 2023-06-09 18:58:03作者: Karlshell

 

package Karl.Demo.DaiLi;

public class Test {
    public static void main(String[] args) {
        BigStar s=new BigStar("杨超越");
        Star star=ProxyUtil.createProxy(s);
        String rs=star.sing("好日子");
        System.out.println(rs);
    }
}
package Karl.Demo.DaiLi;

public interface Star {
    String sing(String name);
    void dane();
}
package Karl.Demo.DaiLi;

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

public class ProxyUtil {
    //设置createProxy方法
    //返回值为Star
    public static Star createProxy(BigStar bigStar){
       /* public static Object newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)
                参数1:用于指定一个类加载器
                参数2:指定生成的代理长什么样子,也就是有哪些方法
                参数3:用来指定生成的代理对象要干什么事情*/

        Star starProxy=(Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},new InvocationHandler(){
                    @Override//回调方法
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //代理对象要做的事情,会在这里写代码
                        if (method.getName().equals("sing")){
                            System.out.println("准备话筒,收钱20万");
                        }else if (method.getName().equals("dance")){
                            System.out.println("准备场地,收钱1000万");
                        }
                        //返回给上面的bigStar参数
                        return method.invoke(bigStar,args);
                    }
                });
        //返回给上面的starProxy方法
        return starProxy;
    }
}
package Karl.Demo.DaiLi;

public class BigStar implements Star{
    //设置成员变量name
    private String name;
    //把传入的name赋值给本类成员变量name
    public BigStar(String name){
        this.name=name;
    }


    //重写接口方法
    @Override
    //设置方法传入name
    public String sing(String name) {
        //获取本类name获取传入的name
        System.out.println(this.name+"正在唱:"+name);
        //返回值
        return "谢谢大家!";
    }

    @Override
    //因为跳舞没有名字所以没有传入name
    //void表示没有返回值
    public void dane() {
        System.out.println(this.name+"正在优雅的跳舞");
    }
}