【Java】动态代理

JAVA实现静态代理

实现步骤:
1.创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情。
2.创建厂家类,实现1步骤的接口
3.创建商家,就是代理,也需要实现1步骤中的接口。
4.创建客户端类,调用商家的方法买一个u盘。

接口

package com.su;

public interface UsbSell {
    //定义方法 参数amount表示购买的数量,
    float sell(int amounnt);
}

目标类

package com.su;

//目标类:金士顿厂家,不接受用户的单独购买
public class UsbKingFactory implements UsbSell{
    @Override
    public float sell(int amounnt) {
        //一个128G的U盘是85元,后期根据数量调整价格
        return 85.0f;
    }
}

代理类

package com.su;

//taobao是一个商家,代理金士顿u盘的销售
public class TaoBao implements UsbSell{
    //声明商家代理的厂家具体是谁
    private UsbKingFactory factory = new UsbKingFactory();
    @Override
    public float sell(int amounnt) {

        //向厂家发送订单,告诉商家,我买了u盘,厂家发货
        float price = factory.sell(amounnt);//厂家的价格

        price = price + 25;//代理类完成目标类方法调用后,增强了功能
        return price;
    }
}

代理类:
有一个属性是目标类
目标类中方法的调用
功能增强

客户端类

package com.su;

public class ShopMain {
    public static void main(String[] args) {
        TaoBao taoBao = new TaoBao();
        float price = taoBao.sell(1);
        System.out.println("通过淘宝的商家,购买u盘的单价:"+price);
    }
}

缺点:一个目标类就要对应一个代理类。

动态代理

Java 动态代理详解

接口

package com.su;

public interface UserDao {
    int add(int a,int b);
    String update(String id);

}

被代理的类

package com.su;

public class UserDaoimpl implements UserDao{
    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public String update(String id) {
        return id;
    }
}

调用请求处理器

package com.su;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

class UserDaoProxy implements InvocationHandler {
    private Object obj;

    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法之前执行...."+method.getName()+" 传递的参数..."+ Arrays.toString(args));
        Object res = method.invoke(obj, args);
        System.out.println("方法之后执行..."+obj);
        return res;
    }
}

测试

package com.su;


import java.lang.reflect.Proxy;

public class JDKProxy {
    public static void main(String[] args) {

        //创建被代理的对象,UserDao接口的实现类
        UserDaoimpl userDaoimpl = new UserDaoimpl();

        //获取被代理对象的ClassLoader
        ClassLoader classLoader = userDaoimpl.getClass().getClassLoader();

        //获取被代理对象实现的接口的Class集合
        Class<?>[] interfaces = userDaoimpl.getClass().getInterfaces();

        //创建一个将传给代理类的调用请求处理器,处理所有的代理对象上的方法调用
        UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoimpl);

        //创建代理对象
        UserDao proxy =  (UserDao) Proxy.newProxyInstance(classLoader,interfaces,userDaoProxy);

        //调用方法
        int temp = proxy.add(2, 3);
        System.out.println(temp);

        String str = proxy.update("hello,world!");
        System.out.println(str);

    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值