无侵入式的给代码增加额外的功能
代理的作用:对象如果干的事情太繁琐,就可以通过代理来转移部分职责;也就是相当于把对象的的方法拆开一些步骤分给代理做,对象做关键的就行了;并且代理做的这些繁琐的事情的名字也要和对象做这件事情的名字一样;
对象和代理要实现同一个接口,接口中就是被代理的所有方法
对象
package com.ln1;
import com.FC.Star;
public class Goods implements Star {
private String name;
private String id;
private int age;
private String rightPassWord = "123456";
public Goods() {
}
public Goods(String name, String id, int age, String rightPassWord) {
this.name = name;
this.id = id;
this.age = age;
this.rightPassWord = rightPassWord;
}
public Goods(String name){
this.name = name;
}
public String sing(String Name){
System.out.println(this.name + " sing " + Name);
return "thanks";
}
public void dance(){
System.out.println(this.name + "dance");
}
}
代理
package com.FC;
import com.ln1.Goods;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtil {
public static Star createProxy(Goods goods){
Star star = (Star) Proxy.newProxyInstance(
ProxyUtil.class.getClassLoader(), //用于指定用哪个类加载器,去加载生成的代理类
new Class[]{Star.class},//指定接口,这些接口用于指定生成的代理长什么样,也就是有哪些方法
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//参数1:代理的对象
//参数2:要运行的方法
//参数3:调用方法时,传递的实参
if("sing".equals(method.getName())){
System.out.println("收钱,准备话筒");
}
else if("dance".equals(method.getName())){
System.out.println("收钱,准备场地");
}
return method.invoke(goods,args);
}
}//用来指定生成的代理对象要干什么事情
);
return star;
}
}
接口
package com.FC;
public interface Star {
public abstract String sing(String Name);
public abstract void dance();
}
运行代码
package com.FC;
import com.ln1.Goods;
public class Text {
public static void main(String[] args) {
Goods goods = new Goods("yoki");
Star proxy = ProxyUtil.createProxy(goods);
String result = proxy.sing("入睡");
System.out.println(result);
proxy.dance();
}
}