1什么是代理?
代理指:某些场景下对象会找一个代理对象,来辅助自己完成一些工作:如歌星(经纪人),买房的人(房产中介);
代理主要是对对象的行为额外做一些辅助操作
2Java中实现动态代理的步骤是什么样的?
必须存在接口
被代理对象需要实现接口
使用Porxy类提供的方法,得到对象的代理对象
public static Object newProxyInstance(ClassLoader loader ,Class<?>[] interface,InvocationHandler h)
为被代理对象返回一个代理对象
参数1:类加载器,加载代理类,产生代理对象
参数2:真实业务对象的接口(被代理的方法交给代理对象)
参数3:代理的核心处理程序
模拟一些明星的代理,用java实现
创建技能接口
package 动态代理;
/**
* 技能接口
*/
public interface Skill {
void sing();//唱歌
void dance(); //跳舞
}
创建明星类
package 动态代理;
/**
* 明星类
*/
public class Star implements Skill{
private String name;
public Star(String name) {
this.name=name;
}
@Override
public void sing() {
// TODO Auto-generated method stub
System.out.println(name+"正在唱歌");
}
@Override
public void dance() {
// TODO Auto-generated method stub
System.out.println(name+"正在跳舞");
}
}
创建代理方法类
package 动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SkillPorxy {
public static Skill getProxy(Star object) {
//生成一个代理对象
return (Skill) Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// method是正在调用的方法, args 为参数
System.out.println("收首付款。。。。。。。。。");
Object rs= method.invoke(object, args);
System.out.println("收尾款。。。。。。。");
return rs;
}
});
}
}
测试一下
package 动态代理;
public class Test {
public static void main(String[] args) {
//创建个明星对象
Star s1=new Star("周杰伦");
//生成代理对象
Skill ss1=SkillPorxy.getProxy(s1);
ss1.sing();
ss1.dance();
}
}
最后输出的内容为:
收首付款。。。。。。。。。
周杰伦正在唱歌
收尾款。。。。。。。
收首付款。。。。。。。。。
周杰伦正在跳舞
收尾款。。。。。。。
3通过代理对象调用方法,执行流程是什么样的?
先走向代理
代理可以为方法额外做一些辅助工作
开发真正触发对象的方法的执行
回到代理中,由代理负责返回结果给方法的调用者