package a07;

public class BigStar implements Star{
    String name;

    public BigStar() {
    }

    public BigStar(String name) {
        this.name = name;
    }
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "BigStar{name = " + name + "}";
    }

    @Override
    public void sing(String name) {
        System.out.println(this.name+"正在唱"+name);
    }

    @Override
    public void dance() {

        System.out.println(this.name+"正在跳舞");
    }
}
----------------------------
package a07;

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

/*
类的作用:
创建一个代理

 */
public class ProxyUtil {

    /*
    方法的作用:
    给一个明星对象创建一个代理
    形参:被代理的明星
    返回值:代理
     */
    public static Star createProxy(BigStar star){
        //public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
        /*
        参数一:用于指定类加载器,去加载代理类
        参数二:用于指定被代理类实现的接口
        参数三:用于指定代理类的处理方式
         */
        Star s = (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("我是经纪人,我要收代理费");
                        } else if (method.getName().equals("dance")) {
                            System.out.println("我是经纪人,我要收场地费");
                        }
                        return method.invoke(star, args);
                    }
                }
        );
        return s;
    }
}
------------------------------------
package a07;

public interface Star {
    public abstract void sing(String name);
    public abstract void dance();
}
--------------------------------------
package a07;

public class test {
    public static void main(String[] args) {
        //1.获取代理对象
        BigStar star=new BigStar("haha");
        Star proxy = ProxyUtil.createProxy(star);
        //2.调用代理对象的方法
       proxy.sing("666");
    }
}