java如何优雅的修改jar包中的方法处理逻辑

1、场景举例

有一个jar包中的类A,其中有一个方法getName()我想要改成自己的处理逻辑,但是这个方法在jar包中的其他方法也有被调用过。

2、原有代码示例

public interface AA {
    String getName();
}

public class A implements AA{

    @Override
    public String getName() {
        return "A";
    }
}

3、处理办法

3.1 定义公共的自定义处理逻辑

public class MethodReplacerHandler implements InvocationHandler {
    private final Object target;
    private final Map<String, MethodLogic> methodLogicMap;

    public MethodReplacerHandler(Object target, Map<String, MethodLogic> methodLogicMap) {
        this.target = target;
        this.methodLogicMap = methodLogicMap;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 查找对应方法的处理逻辑
        MethodLogic logic = methodLogicMap.get(method.getName());
        if (logic != null) {
            return logic.apply(target,method, args); // 调用处理逻辑
        }
        return method.invoke(target, args); // 如果没有对应逻辑,正常调用目标方法
    }
}

3.2 定义工厂用以构建目标对象

public class ProxyFactory {
    public static Object createProxy(Object target, Map<String, MethodLogic> methodLogicMap) {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new MethodReplacerHandler(target, methodLogicMap)
        );
    }
}

3.3 自定义处理逻辑的方法,具体需要自己去实现这个接口

public interface MethodLogic {
    Object apply(Object target, Method method, Object[] args) throws Throwable;
}

4、使用

4.1 实现MethodLogic接口,自定义方法处理逻辑

public class AMethodLogic implements MethodLogic {

        @Override
        public Object apply(Object target, Method method, Object[] args) throws Throwable {
            //.....省略100行处理逻辑
            return "======AGetNameLogic的apply处理结果========";

        }
    }

4.2 调用

public class Demo {
   public static void main(String[] args) {
       A a = new A();
       HashMap<String, MethodLogic> logicHashMap = new HashMap<>();
       logicHashMap.put("getName", new AMethodLogic());

       AA aa = (AA) ProxyFactory.createProxy(a, logicHashMap);

       System.out.println(aa.getName());
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小白QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值