Loading

Java中的JDK动态代理

实现步骤

1代理对象和真实对象实现相同接口

先创建一个接口 并创建一个类实现接口中的方法
创建接口Salecomputer

public interface Salecomputer {
   abstract public String sale(double money);
   abstract  public  void show ();
}

创捷实现类 实现接口

public class lenvo implements Salecomputer{


    @Override
    public String sale(double money) {
        System.out.println("花了"+money);
             return "买电脑";
    }

    @Override
    public void show() {
        System.out.println("买了电脑");
    }
}

创建测试类 
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class proxyText {
    public static void main(String[] args) {
        //创建真实对象
        lenvo lenvo = new lenvo();
        //动态代理增强 lenvo 对象
        //  Proxy.newProxyInstance();创建一个代理实例
     //第二个参数为被代理对象(真实对象)的接口  //第三个参数为 实现InvocationHandle的匿名内部类(zai)
        //Proxy.newProxyInstance() 返回一个Object 类型的代理对象  我们可以把它转为接口类型
       Salecomputer proxy_lenvo = (Salecomputer) Proxy.newProxyInstance(lenvo.getClass().getClassLoader(), lenvo.getClass().getInterfaces(),
                new InvocationHandler() {

                //invoke 方法:代理逻辑编写的方法,代理对象调用的所有方法都会执行该方=
               //参数  1 proxy   -代理对象
                   //   2  method 代理对象调用的方法封装为的对象
                    //  3 args 代理对象调用方法时传递的实际参数数组[]
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //1增强参数  (需要参数的方法才需要增强)在该结口中只有 sale 需要参数
                            if(method.getName().equals("sale")){
                                //业务逻辑
                                double money = (double) args[0];
                                money = money *0.85;
                                //使用真实对象调用方法
                                Object obj = method.invoke(lenvo, money);
                                // 增强返回值
                                return obj + "送了一个鼠标";
                            }else {
                                Object obj = method.invoke(lenvo, args);
                                return obj;
                            }


                    }
                }

        );
       //使用代理对象 调用被代理对象的方法
            String computer = proxy_lenvo.sale(8888);
        System.out.println(computer);


    }
}

posted @ 2022-03-11 16:28  冰莫莫  阅读(104)  评论(0编辑  收藏  举报