
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+"正在优雅的跳舞");
}
}

