代理指:某些场景下对象会找一个代理对象,来辅助自己完成一些工作:如歌星(经纪人),买房的人(房产中介);
代理主要是对对象的行为额外做一些辅助操作
必须存在接口
被代理对象需要实现接口
使用Porxy类提供的方法,得到对象的代理对象
public static Object newProxyInstance(ClassLoader loader ,Class>[] interface,InvocationHandler h)
为被代理对象返回一个代理对象
参数1:类加载器,加载代理类,产生代理对象
参数2:真实业务对象的接口(被代理的方法交给代理对象)
参数3:代理的核心处理程序
创建技能接口
- 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();
-
- }
-
-
-
-
- }
最后输出的内容为:
收首付款。。。。。。。。。
周杰伦正在唱歌
收尾款。。。。。。。
收首付款。。。。。。。。。
周杰伦正在跳舞
收尾款。。。。。。。
先走向代理
代理可以为方法额外做一些辅助工作
开发真正触发对象的方法的执行
回到代理中,由代理负责返回结果给方法的调用者