refactor(framework): rename AgentRunningModule/SubModule to AbstractAgent* and migrate module inheritance usage

This commit is contained in:
2026-02-19 15:04:30 +08:00
parent 8735660830
commit c7f113b59a
47 changed files with 155 additions and 159 deletions

View File

@@ -4,9 +4,9 @@ import cn.hutool.core.util.ClassUtil;
import org.reflections.Reflections;
import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentSubModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.ActivateModel;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AfterExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
@@ -31,7 +31,7 @@ import static work.slhaf.partner.api.agent.util.AgentUtil.getMethodAnnotationTyp
* <ol>
* <li>
* <p>{@link ModuleCheckFactory#annotationAbstractCheck(Set, Class)}</p>
* 所有添加了 {@link AgentModule} 注解的类都将作为Agent的执行模块为规范模块入口都必须实现抽象类: {@link AgentRunningModule}; {@link AgentSubModule} 注解所在类则必须实现 {@link AgentRunningSubModule}
* 所有添加了 {@link AgentModule} 注解的类都将作为Agent的执行模块为规范模块入口都必须实现抽象类: {@link AbstractAgentRunningModule}; {@link AgentSubModule} 注解所在类则必须实现 {@link AbstractAgentSubModule}
* </li>
* <li>
* <p>{@link ModuleCheckFactory#moduleConstructorsCheck(Set)}</p>
@@ -60,8 +60,8 @@ public class ModuleCheckFactory extends AgentBaseFactory {
ExtendedModules extendedModules = getExtendedModules();
checkIfClassCorresponds(annotatedModules, extendedModules);
//检查注解AgentModule或AgentSubModule所在类是否继承了对应的抽象类
annotationAbstractCheck(annotatedModules.moduleTypes(), AgentRunningModule.class);
annotationAbstractCheck(annotatedModules.subModuleTypes(), AgentRunningSubModule.class);
annotationAbstractCheck(annotatedModules.moduleTypes(), AbstractAgentRunningModule.class);
annotationAbstractCheck(annotatedModules.subModuleTypes(), AbstractAgentSubModule.class);
//检查AgentModule是否具备无参构造方法
moduleConstructorsCheck(annotatedModules.moduleTypes());
moduleConstructorsCheck(annotatedModules.subModuleTypes());
@@ -72,11 +72,11 @@ public class ModuleCheckFactory extends AgentBaseFactory {
}
private ExtendedModules getExtendedModules() {
Set<Class<?>> moduleTypes = reflections.getSubTypesOf(AgentRunningModule.class)
Set<Class<?>> moduleTypes = reflections.getSubTypesOf(AbstractAgentRunningModule.class)
.stream()
.filter(ClassUtil::isNormalClass)
.collect(Collectors.toSet());
Set<Class<?>> subModuleTypes = reflections.getSubTypesOf(AgentRunningSubModule.class)
Set<Class<?>> subModuleTypes = reflections.getSubTypesOf(AbstractAgentSubModule.class)
.stream()
.filter(ClassUtil::isNormalClass)
.collect(Collectors.toSet());
@@ -156,10 +156,10 @@ public class ModuleCheckFactory extends AgentBaseFactory {
private void checkLocation(Set<Class<?>> types) {
for (Class<?> type : types) {
if (AgentRunningModule.class.isAssignableFrom(type)) {
if (AbstractAgentRunningModule.class.isAssignableFrom(type)) {
continue;
}
if (AgentRunningSubModule.class.isAssignableFrom(type)) {
if (AbstractAgentSubModule.class.isAssignableFrom(type)) {
continue;
}
if (ActivateModel.class.isAssignableFrom(type)) {

View File

@@ -4,9 +4,9 @@ import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
import work.slhaf.partner.api.agent.factory.AgentRegisterFactory;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.ModuleFactoryContext;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.Module;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentSubModule;
import work.slhaf.partner.api.agent.factory.module.annotation.Init;
import work.slhaf.partner.api.agent.factory.module.exception.ModuleInitHookExecuteFailedException;
import work.slhaf.partner.api.agent.factory.module.pojo.BaseMetaModule;
@@ -59,12 +59,12 @@ public class ModuleInitHookExecuteFactory extends AgentBaseFactory {
protected void run() {
//遍历模块列表,并向上查找@Init注解
for (MetaSubModule metaSubModule : subModuleList) {
List<MetaMethod> initHookMethods = collectInitHookMethods(metaSubModule.getClazz(),AgentRunningModule.class);
List<MetaMethod> initHookMethods = collectInitHookMethods(metaSubModule.getClazz(), AbstractAgentRunningModule.class);
proceedInitMethods(metaSubModule, initHookMethods);
}
for (MetaModule metaModule : moduleList) {
List<MetaMethod> initHookMethods = collectInitHookMethods(metaModule.getClazz(), AgentRunningSubModule.class);
List<MetaMethod> initHookMethods = collectInitHookMethods(metaModule.getClazz(), AbstractAgentSubModule.class);
proceedInitMethods(metaModule, initHookMethods);
}
}
@@ -79,7 +79,7 @@ public class ModuleInitHookExecuteFactory extends AgentBaseFactory {
}
}
private List<MetaMethod> collectInitHookMethods(Class<?> clazz, Class<? extends Module> target) {
private List<MetaMethod> collectInitHookMethods(Class<?> clazz, Class<? extends AbstractAgentModule> target) {
Set<Class<?>> classes = collectExtendedClasses(clazz, target);
return classes.stream()
.map(Class::getDeclaredMethods)

View File

@@ -10,9 +10,9 @@ import work.slhaf.partner.api.agent.factory.capability.CapabilityCheckFactory;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.CapabilityFactoryContext;
import work.slhaf.partner.api.agent.factory.context.ModuleFactoryContext;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.Module;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentSubModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AfterExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.BeforeExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule;
@@ -96,8 +96,8 @@ public class ModuleProxyFactory extends AgentBaseFactory {
}
private void createProxiedInstances() {
generateModuleProxy(moduleList, AgentRunningModule.class);
generateModuleProxy(subModuleList, AgentRunningSubModule.class);
generateModuleProxy(moduleList, AbstractAgentRunningModule.class);
generateModuleProxy(subModuleList, AbstractAgentSubModule.class);
updateInstanceMap(moduleInstances, moduleList);
updateInstanceMap(subModuleInstances, subModuleList);
updateCapabilityHolderInstances();
@@ -115,7 +115,7 @@ public class ModuleProxyFactory extends AgentBaseFactory {
}
private void generateModuleProxy(List<? extends BaseMetaModule> list, Class<? extends Module> overrideSource) {
private void generateModuleProxy(List<? extends BaseMetaModule> list, Class<? extends AbstractAgentModule> overrideSource) {
for (BaseMetaModule module : list) {
Class<?> clazz = module.getClazz();
try {
@@ -128,10 +128,10 @@ public class ModuleProxyFactory extends AgentBaseFactory {
}
}
private void generateProxiedInstances(MethodsListRecord record, BaseMetaModule module, Class<? extends Module> overrideSource) {
private void generateProxiedInstances(MethodsListRecord record, BaseMetaModule module, Class<? extends AbstractAgentModule> overrideSource) {
try {
Class<? extends Module> clazz = module.getClazz();
Class<? extends Module> proxyClass = new ByteBuddy()
Class<? extends AbstractAgentModule> clazz = module.getClazz();
Class<? extends AbstractAgentModule> proxyClass = new ByteBuddy()
.subclass(clazz)
.method(ElementMatchers.isOverriddenFrom(overrideSource))
.intercept(MethodDelegation.to(new ModuleProxyInterceptor(record.post, record.pre)))
@@ -159,7 +159,7 @@ public class ModuleProxyFactory extends AgentBaseFactory {
//获取该类本身的hook逻辑
collectHookMethods(post, pre, clazz);
//获取它所继承、实现的抽象类或接口, 以Module为终点收集继承链上所有父类和接口
Set<Class<?>> classes = collectExtendedClasses(clazz, Module.class);
Set<Class<?>> classes = collectExtendedClasses(clazz, AbstractAgentModule.class);
//获取这些类中的hook逻辑
collectHookMethods(post, pre, classes);
return new MethodsListRecord(post, pre);

View File

@@ -5,8 +5,8 @@ import org.reflections.Reflections;
import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
import work.slhaf.partner.api.agent.factory.context.AgentRegisterContext;
import work.slhaf.partner.api.agent.factory.context.ModuleFactoryContext;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentSubModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
import work.slhaf.partner.api.agent.factory.module.annotation.CoreModule;
@@ -60,34 +60,7 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
setSubModuleList();
}
private void setSubModuleList() {
Set<Class<?>> subModules = reflections.getTypesAnnotatedWith(AgentSubModule.class);
for (Class<?> subModule : subModules) {
if (!ClassUtil.isNormalClass(subModule)) {
continue;
}
Class<? extends AgentRunningSubModule> clazz = subModule.asSubclass(AgentRunningSubModule.class);
MetaSubModule metaSubModule = new MetaSubModule();
metaSubModule.setClazz(clazz);
subModuleList.add(metaSubModule);
}
}
private void setModuleList() {
//反射扫描获取@AgentModule所在类, 该部分为Agent流程执行模块
Set<Class<?>> modules = reflections.getTypesAnnotatedWith(AgentModule.class);
for (Class<?> module : modules) {
if (!ClassUtil.isNormalClass(module)) {
continue;
}
Class<? extends AgentRunningModule> clazz = module.asSubclass(AgentRunningModule.class);
MetaModule metaModule = getMetaModule(clazz);
moduleList.add(metaModule);
}
moduleList.sort(Comparator.comparing(MetaModule::getOrder));
}
private static MetaModule getMetaModule(Class<? extends AgentRunningModule> clazz) {
private static MetaModule getMetaModule(Class<? extends AbstractAgentRunningModule> clazz) {
MetaModule metaModule = new MetaModule();
AgentModule agentModule;
if (clazz.isAnnotationPresent(CoreModule.class)){
@@ -101,4 +74,31 @@ public class ModuleRegisterFactory extends AgentBaseFactory {
return metaModule;
}
private void setSubModuleList() {
Set<Class<?>> subModules = reflections.getTypesAnnotatedWith(AgentSubModule.class);
for (Class<?> subModule : subModules) {
if (!ClassUtil.isNormalClass(subModule)) {
continue;
}
Class<? extends AbstractAgentSubModule> clazz = subModule.asSubclass(AbstractAgentSubModule.class);
MetaSubModule metaSubModule = new MetaSubModule();
metaSubModule.setClazz(clazz);
subModuleList.add(metaSubModule);
}
}
private void setModuleList() {
//反射扫描获取@AgentModule所在类, 该部分为Agent流程执行模块
Set<Class<?>> modules = reflections.getTypesAnnotatedWith(AgentModule.class);
for (Class<?> module : modules) {
if (!ClassUtil.isNormalClass(module)) {
continue;
}
Class<? extends AbstractAgentRunningModule> clazz = module.asSubclass(AbstractAgentRunningModule.class);
MetaModule metaModule = getMetaModule(clazz);
moduleList.add(metaModule);
}
moduleList.sort(Comparator.comparing(MetaModule::getOrder));
}
}

View File

@@ -7,7 +7,7 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.Model;
/**
* 模块基类
*/
public abstract class Module {
public abstract class AbstractAgentModule {
@Getter
@Setter

View File

@@ -11,7 +11,7 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowC
* 流程执行模块基类
*/
@Slf4j
public abstract class AgentRunningModule<C extends RunningFlowContext> extends Module {
public abstract class AbstractAgentRunningModule<C extends RunningFlowContext> extends AbstractAgentModule {
public abstract void execute(C context);
@BeforeExecute
@@ -30,7 +30,7 @@ public abstract class AgentRunningModule<C extends RunningFlowContext> extends M
} else if (this.getClass().isAnnotationPresent(CoreModule.class)) {
return CoreModule.class.getAnnotation(AgentModule.class).name();
}else {
return "Unknown Module";
return "Unknown AbstractAgentModule";
}
}
}

View File

@@ -0,0 +1,11 @@
package work.slhaf.partner.api.agent.factory.module.abstracts;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class AbstractAgentSubModule<I, O> extends AbstractAgentModule {
public abstract O execute(I data);
}

View File

@@ -80,11 +80,11 @@ public interface ActivateModel {
* @return 持有的model实例
*/
default Model getModel() {
return ((Module) this).getModel();
return ((AbstractAgentModule) this).getModel();
}
default void setModel(Model model) {
((Module) this).setModel(model);
((AbstractAgentModule) this).setModel(model);
}
/**

View File

@@ -1,15 +0,0 @@
package work.slhaf.partner.api.agent.factory.module.abstracts;
import lombok.extern.slf4j.Slf4j;
import work.slhaf.partner.api.agent.factory.module.annotation.AfterExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule;
import work.slhaf.partner.api.agent.factory.module.annotation.BeforeExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.CoreModule;
@Slf4j
public abstract class AgentRunningSubModule<I, O> extends Module {
public abstract O execute(I data);
}

View File

@@ -10,7 +10,7 @@ import java.lang.annotation.Target;
* 仅适用于以下类中的方法:
* 1. <code>@AgentModule</code>注解所在类
* 2. <code>ActivateModel</code>子类
* 3. <code>AgentRunningModule</code>或者<code>AgentRunningSubModule</code>子类
* 3. <code>AbstractAgentRunningModule</code>或者<code>AbstractAgentSubModule</code>子类
*/
@Target(ElementType.METHOD)

View File

@@ -9,7 +9,7 @@ import java.lang.annotation.Target;
* 仅适用于以下类中的方法:
* 1. <code>@AgentModule</code>注解所在类
* 2. <code>ActivateModel</code>子类
* 3. <code>AgentRunningModule</code>或者<code>AgentRunningSubModule</code>子类
* 3. <code>AbstractAgentRunningModule</code>或者<code>AbstractAgentSubModule</code>子类
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

View File

@@ -1,10 +1,10 @@
package work.slhaf.partner.api.agent.factory.module.pojo;
import lombok.Data;
import work.slhaf.partner.api.agent.factory.module.abstracts.Module;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentModule;
@Data
public abstract class BaseMetaModule <C extends Module> {
public abstract class BaseMetaModule<C extends AbstractAgentModule> {
private Class<? extends C> clazz;
private C instance;
}

View File

@@ -2,11 +2,11 @@ package work.slhaf.partner.api.agent.factory.module.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
@EqualsAndHashCode(callSuper = true)
@Data
public class MetaModule extends BaseMetaModule<AgentRunningModule>{
public class MetaModule extends BaseMetaModule<AbstractAgentRunningModule> {
private String name;
private int order;
private boolean enabled = true;

View File

@@ -2,9 +2,9 @@ package work.slhaf.partner.api.agent.factory.module.pojo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningSubModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentSubModule;
@EqualsAndHashCode(callSuper = true)
@Data
public class MetaSubModule extends BaseMetaModule<AgentRunningSubModule>{
public class MetaSubModule extends BaseMetaModule<AbstractAgentSubModule> {
}

View File

@@ -4,21 +4,21 @@ import net.bytebuddy.ByteBuddy;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import org.junit.jupiter.api.Test;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class ModuleProxyTest {
public class AbstractAgentModuleProxyTest {
@Test
public void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException, ClassNotFoundException {
Class<? extends AgentRunningModule> clazz = new ByteBuddy().subclass(MyAgentRunningModule.class)
.method(ElementMatchers.isOverriddenFrom(AgentRunningModule.class))
Class<? extends AbstractAgentRunningModule> clazz = new ByteBuddy().subclass(MyAbstractAgentRunningAbstractAgentModule.class)
.method(ElementMatchers.isOverriddenFrom(AbstractAgentRunningModule.class))
.intercept(MethodDelegation.to(
new MyModuleProxyInterceptor()
))
.make()
.load(ModuleProxyTest.class.getClassLoader())
.load(AbstractAgentModuleProxyTest.class.getClassLoader())
.getLoaded();
clazz.getConstructor().newInstance().execute(null);
}

View File

@@ -0,0 +1,11 @@
package module;
import work.slhaf.partner.api.agent.factory.module.abstracts.AbstractAgentRunningModule;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
public class MyAbstractAgentRunningAbstractAgentModule extends AbstractAgentRunningModule {
@Override
public void execute(RunningFlowContext context) {
System.out.println("MyAbstractAgentRunningAbstractAgentModule");
}
}

View File

@@ -1,11 +0,0 @@
package module;
import work.slhaf.partner.api.agent.factory.module.abstracts.AgentRunningModule;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
public class MyAgentRunningModule extends AgentRunningModule {
@Override
public void execute(RunningFlowContext context) {
System.out.println("MyAgentRunningModule");
}
}