实际上就是在内存中生产一个对象,该对象实现了指定的目标对象的所有接口,代理对象和目标对象是兄弟关系。
jdk自带动态代理技术,需要使用一个静态方法来创建代理对象,它需要目标对象必须实现接口,生产的代理对象和原对象都实现相同的接口。
1.创建接口
public interface star{
String sing(string name);
void dance();
}
2.实现Star接口
public class Bigstar implemnts 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+ "正在优关的跳舞~-");
}
}
3.创建代理方法工具类
public class Proxyutil {
public static Star createProxy(BigStar bigStar){
//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().eguals("sing")){
System.out.println("准备话筒,收钱20万");
}else if(method.getName().equals("dance")){
System.out.println("准备场地,收钱1000万");
}
return method.invoke(bigstar,args);
});
return starProxy;
}
}
4.测试类
public class Test {
public static void main(string[]args){
BigStar s=new BigStar( name:"杨超越");
Star starProxy = ProxyUtil.createProxy(s);
String rs =starProxy.sing( name:"好日子");
System.out.println(rs);
starProxy.dance();
}
}
输出结果: