您的位置:首页 > 编程语言 > Java开发

java中动态代理Proxy简单实现

2020-03-29 13:00 316 查看

创建一个接口,如果实现类进行方法增强没有将会报如下错误


接口

/**
* 对生产厂家的要求
*/
public interface IProducer {

/**
* 销售
* @param money
*/
public void saleProduct(float money);

/**
* 售后
* @param money
*/
public void afterService(float money);
}

实现接口的类

public class Producer  {

/**
* 销售
* @param money
*/
//    @Override
public void saleProduct(float money) {
System.out.println("销售产品:并拿到钱"+money);
}

/**
* 售后
* @param money
*/
//    @Override
public void afterService(float money){
System.out.println("提供售后,并拿到钱"+money);
}
}

测试类并在此类中使用动态代理增加之前方法

/**
* 模拟一个消费者
* @author DELL
*/
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
//        producer.saleProduct(10000f);

/**
* newProxyInstance方法的参数:
*  ClassLoader:类加载器
*      它是用于加载代理对象字节码的,和被代理对象使用相同的类加载器
*      class[] 字节码数组
*          它是用于代理对象和被代理对象的相同方法,
*   InvocationHandler 用于提供增强的代码
*/
IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
producer.getClass().getInterfaces(),
new InvocationHandler() {
/**
*
* @param proxy 代理对象的引用
* @param method 当前执行的方法
* @param args 当前执行方法所需的参数
* @return   和被代理对象方法有相同的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//提供增强的代码
Object returnValue = null;
//1.获取方法执行的参数
Float money = (Float)args[0];
if("saleProduct".equals(method.getName())){
returnValue = method.invoke(producer, money*0.8f);
}
return returnValue;
}
});
proxyProducer.saleProduct(10000f);
}
}

这些类可以理解销售商和生产商的关系,定义了一个销售和售后的规范
实现类去实现,但是现在在不改动源码的情况下对money进行*0.8的操作(可用理解为销售商要在钱上收取20%)

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
qq_44801336 发布了54 篇原创文章 · 获赞 5 · 访问量 745 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: