java如何动态地修改接口代码?

我的场景是这样的,我有一个主系统,我希望第三方可以开发插件,第三方插件实现我的接口,开发者看到的代码是

package com.simple.plug;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.simple.mainandplug.HostSystem;
import com.simple.mainandplug.HostSystemWrap;

import java.util.List;

public interface PlugBase {

    default <T> List<T> selectList(LambdaQueryWrapper<T> q) {
        return null;
    }

}

主系统在加载这个插件的时候再具体实现selectList方法,希望不要使用太复杂的技术,比如agent、proxy,我希望我写好了具体的代码,存成文件的,直接替换掉。

阅读 945
3 个回答

如果你要做插件系统,可以看看 pf4j: https://pf4j.org/

热加载热更新什么的都给你搞定了

老弟,不用动态啦?哈哈,像jdbc和springboot3都有spi的影子,参考spi的实现,基本效果也出来了
不过吧,你这感觉没写多久代码的样子,就别整这些花里胡哨的了,这些需求都是自己yy的吧?

其实你这个场景不用 “动态改接口代码” 这么绕,核心是让插件里的默认方法在主系统加载时用你的实现替换掉。
你可以这么做:主系统里写好selectList的实际实现(比如单独写个工具类),等插件加载后,通过反射拿到插件类里的selectList方法,把它的逻辑替换成你工具类里的实现。但注意 Java 接口的默认方法不能直接改,所以更简单的是:让插件实现类不要直接用接口的默认方法,而是主系统加载插件时,把自己的实现逻辑 “注入” 给插件类(比如插件类留个 setter 方法,主系统加载后调用 setter 把实际逻辑传过去)。
另外你说 “存成文件直接替换”,其实可以把主系统的实现写成一个独立的类文件,插件加载时通过类加载器把这个类加载进来,让插件去调用这个类的方法,这样后续要改实现,直接替换这个类文件就行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进