编程语言
首页 > 编程语言> > Java JDK代理的实现 (初始)

Java JDK代理的实现 (初始)

作者:互联网

新手自学上路, 肤浅理解, 见谅

项目结构

 约定的接口 Sell 文件

package com.fmg.sells;

// 价格类, 所以厂家都必须实现这个类, 来交流价格

public interface Sell {
    float sell(int num);
}

实现的厂家 Xinhua文件

package com.fmg.factory;

// 新华 卖书, 实现 Sell 类
// 平均一本书是 9.9 元, num 本书就是 9.9 * num 元

import com.fmg.sells.Sell;

public class XinHua implements Sell {
    @Override
    public float sell(int num) {
        return 9.9f * num;
    }
}

测试的文件 testMain文件

package com.fmg;

// 测试类
// 因为我从新华批量买书, 肯定是为了赚利润, 所以我的出售价格肯定是在原价上面加钱
// 所以不能直接调用 factory 里面的 XinHua 接口, 不然就白忙活了
// 所以需要用到代理, 代理从新华买了书, 价格进行从新计算后, 返给我, 我再卖, 赚利润

import com.fmg.factory.XinHua;
import com.fmg.handle.XinHuaProxy;
import com.fmg.sells.Sell;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class TestMain {
    public static void main(String[] args) {
        // 这里用多态, 因为都实现了 Sell 类
        Sell sell = new XinHua();
        // 创建 InvocationHandler
        InvocationHandler invocationHandler = new XinHuaProxy(sell);
        // 获取类文件
        Class myClass = sell.getClass();
        // 创建代理
        /**
         * 第一个参数, 需要代理的类的 类加载器
         * 第二个参数, 需要代理的类的 接口(这就是为什么JDK代理必须实现interface了)
         * 第三个参数, invocationHandler 处理器, 通过这个对代理对象的结果进行加工, 拓展(功能增强)
         */
        Sell proxy = (Sell)Proxy.newProxyInstance(myClass.getClassLoader(),
                myClass.getInterfaces(),
                invocationHandler);

        // proxy 等同于 一个实现了 Sell 接口的 接口
        Object res = proxy.sell(10);
        // 厂家卖书 9.9元一本, 我进货10本, 买了 118.8, 转了十几块
        System.out.println(res); // 结果 118.8
    }
}

代理 XinHuaProxy 处理函数

package com.fmg.handle;

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

public class XinHuaProxy implements InvocationHandler {
    // target私有类对象, 调用哪个对象里面的方法, 这个target就是哪个类
    private Object target = null;

    // 类对象通过构造函数获取
    public XinHuaProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /**
         * proxy: 可以不用管它, 用不上
         * method: 方法名, 最后使用的时候调用
         * args: 参数数组, 直接当参数用就行, 也是最后使用的使用传入
         */
        Object res = method.invoke(target, args);
        // 强转浮点型, 因为价格肯定是一个 浮点数
        float price = (float)res;
        // 功能增强 (在价格上赚点利润, 商家嘛!赚20% 不过分吧)
        price = price * 1.2f;
        return price;
    }
}

 

 

逻辑图, 想学好程序, 就要会画图, 能 "实例化" 的知识才是  最靠谱的东西

 因为本人是前端入门的, 所以很多时候会把 方法(java) 叫 函数(前端) , 其实 两个是一样的东西

标签:Sell,Java,JDK,Object,fmg,import,com,public,初始
来源: https://www.cnblogs.com/fmg224/p/15371639.html