diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java
index 5468fbc4..eb670e40 100644
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java
+++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleCheckFactory.java
@@ -7,10 +7,9 @@ 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.annotation.AfterExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentRunningModule;
import work.slhaf.partner.api.agent.factory.module.annotation.AgentSubModule;
-import work.slhaf.partner.api.agent.factory.module.annotation.BeforeExecute;
+import work.slhaf.partner.api.agent.factory.module.annotation.Init;
import work.slhaf.partner.api.agent.factory.module.exception.ModuleCheckException;
import work.slhaf.partner.api.agent.runtime.config.AgentConfigManager;
@@ -19,8 +18,6 @@ import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
-import static work.slhaf.partner.api.agent.util.AgentUtil.getMethodAnnotationTypeSet;
-
/**
*
Agent启动流程 1
*
@@ -68,7 +65,7 @@ public class ModuleCheckFactory extends AgentBaseFactory {
//检查实现了ActivateModel的模块数量、名称与prompt是否一致
activateModelImplCheck();
//检查hook注解所在位置是否正确
- hookLocationCheck();
+ initHookLocationCheck();
}
private ExtendedModules getExtendedModules() {
@@ -123,31 +120,8 @@ public class ModuleCheckFactory extends AgentBaseFactory {
}
}
- private void hookLocationCheck() {
- //检查@AfterExecute注解
- postHookLocationCheck();
- //检查@BeforeExecute注解
- preHookLocationCheck();
- //检查@Init注解
- initHookLocationCheck();
- }
-
private void initHookLocationCheck() {
- Set> types = getMethodAnnotationTypeSet(AgentRunningModule.class, reflections);
- checkLocation(types);
- }
-
- private void preHookLocationCheck() {
- Set methods = reflections.getMethodsAnnotatedWith(BeforeExecute.class);
- Set> types = methods.stream()
- .map(Method::getDeclaringClass)
- .collect(Collectors.toSet());
- checkLocation(types);
- }
-
-
- private void postHookLocationCheck() {
- Set methods = reflections.getMethodsAnnotatedWith(AfterExecute.class);
+ Set methods = reflections.getMethodsAnnotatedWith(Init.class);
Set> types = methods.stream()
.map(Method::getDeclaringClass)
.collect(Collectors.toSet());
diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java
index a5c355a8..bec08a74 100644
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java
+++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/ModuleProxyFactory.java
@@ -1,35 +1,21 @@
package work.slhaf.partner.api.agent.factory.module;
-import lombok.Getter;
-import net.bytebuddy.ByteBuddy;
-import net.bytebuddy.implementation.MethodDelegation;
-import net.bytebuddy.implementation.bind.annotation.*;
-import net.bytebuddy.matcher.ElementMatchers;
import work.slhaf.partner.api.agent.factory.AgentBaseFactory;
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.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;
import work.slhaf.partner.api.agent.factory.module.exception.ModuleInstanceGenerateFailedException;
import work.slhaf.partner.api.agent.factory.module.exception.ModuleProxyGenerateFailedException;
-import work.slhaf.partner.api.agent.factory.module.exception.ProxiedModuleRunningException;
import work.slhaf.partner.api.agent.factory.module.pojo.BaseMetaModule;
-import work.slhaf.partner.api.agent.factory.module.pojo.MetaMethod;
import work.slhaf.partner.api.agent.factory.module.pojo.MetaModule;
import work.slhaf.partner.api.agent.factory.module.pojo.MetaSubModule;
-import java.lang.reflect.Method;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.stream.Collectors;
-
-import static work.slhaf.partner.api.agent.util.AgentUtil.collectExtendedClasses;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
/**
* Agent启动流程 3
@@ -72,6 +58,7 @@ public class ModuleProxyFactory extends AgentBaseFactory {
@Override
protected void run() {
createProxiedInstances();
+ // TODO 需要同样注入到 AgentStandaloneModule
injectSubModule();
}
@@ -96,10 +83,8 @@ public class ModuleProxyFactory extends AgentBaseFactory {
}
private void createProxiedInstances() {
- generateModuleProxy(moduleList, AbstractAgentRunningModule.class);
- generateModuleProxy(subModuleList, AbstractAgentSubModule.class);
- updateInstanceMap(moduleInstances, moduleList);
- updateInstanceMap(subModuleInstances, subModuleList);
+ generateModuleProxy(moduleList, moduleInstances);
+ generateModuleProxy(subModuleList, subModuleInstances);
updateCapabilityHolderInstances();
}
@@ -115,145 +100,17 @@ public class ModuleProxyFactory extends AgentBaseFactory {
}
- private void generateModuleProxy(List extends BaseMetaModule> list, Class extends AbstractAgentModule> overrideSource) {
+ private void generateModuleProxy(List extends BaseMetaModule> list, HashMap, Object> instanceMap) {
for (BaseMetaModule module : list) {
- Class> clazz = module.getClazz();
try {
- MethodsListRecord record = collectHookMethods(clazz);
- //生成实例
- generateProxiedInstances(record, module, overrideSource);
+ Class extends AbstractAgentModule> clazz = module.getClazz();
+ AbstractAgentModule instance = clazz.getConstructor().newInstance();
+ module.setInstance(instance);
+ instanceMap.put(module.getClazz(), instance);
} catch (Exception e) {
- throw new ModuleProxyGenerateFailedException("创建代理对象失败: " + clazz.getSimpleName(), e);
+ throw new ModuleProxyGenerateFailedException("模块Hook代理生成失败! 代理失败的模块名: " + module.getClazz().getSimpleName(), e);
}
}
}
- private void generateProxiedInstances(MethodsListRecord record, BaseMetaModule module, Class extends AbstractAgentModule> overrideSource) {
- try {
- 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)))
- .make()
- .load(ModuleProxyFactory.class.getClassLoader())
- .getLoaded();
-
-// new ByteBuddy()
-// .subclass(clazz)
-// .method(ElementMatchers.isOverriddenFrom(overrideSource))
-// .intercept(MethodDelegation.to(new ModuleProxyInterceptor(record.post, record.pre)))
-//
-// .make()
-// .saveIn(new File("./generated-classes"));
-
- module.setInstance(proxyClass.getConstructor().newInstance());
- } catch (Exception e) {
- throw new ModuleProxyGenerateFailedException("模块Hook代理生成失败! 代理失败的模块名: " + module.getClazz().getSimpleName(), e);
- }
- }
-
- private MethodsListRecord collectHookMethods(Class> clazz) {
- List post = new ArrayList<>();
- List pre = new ArrayList<>();
- //获取该类本身的hook逻辑
- collectHookMethods(post, pre, clazz);
- //获取它所继承、实现的抽象类或接口, 以Module为终点,收集继承链上所有父类和接口
- Set> classes = collectExtendedClasses(clazz, AbstractAgentModule.class);
- //获取这些类中的hook逻辑
- collectHookMethods(post, pre, classes);
- return new MethodsListRecord(post, pre);
- }
-
- private void collectHookMethods(List post, List pre, Set> classes) {
- for (Class> type : classes) {
- collectPreHookMethods(pre, type);
- collectPostHookMethods(post, type);
- }
- }
-
- private void collectPostHookMethods(List post, Class> type) {
- Set collectedPostHookMethod = Arrays.stream(type.getDeclaredMethods())
- .filter(method -> method.isAnnotationPresent(AfterExecute.class))
- .map(method -> {
- MetaMethod metaMethod = new MetaMethod();
- metaMethod.setMethod(method);
- metaMethod.setOrder(method.getAnnotation(AfterExecute.class).order());
- return metaMethod;
- })
- .collect(Collectors.toSet());
- post.addAll(collectedPostHookMethod);
- }
-
- private void collectPreHookMethods(List pre, Class> type) {
- Set collectedPreHookMethods = Arrays.stream(type.getDeclaredMethods())
- .filter(method -> method.isAnnotationPresent(BeforeExecute.class))
- .map(method -> {
- MetaMethod metaMethod = new MetaMethod();
- metaMethod.setMethod(method);
- metaMethod.setOrder(method.getAnnotation(BeforeExecute.class).order());
- return metaMethod;
- })
- .collect(Collectors.toSet());
- pre.addAll(collectedPreHookMethods);
- }
-
-
- private void collectHookMethods(List post, List pre, Class> clazz) {
- Method[] methods = clazz.getDeclaredMethods();
- for (Method method : methods) {
- if (method.isAnnotationPresent(BeforeExecute.class)) {
- MetaMethod metaMethod = new MetaMethod();
- metaMethod.setOrder(method.getAnnotation(BeforeExecute.class).order());
- pre.add(metaMethod);
- metaMethod.setMethod(method);
- } else if (method.isAnnotationPresent(AfterExecute.class)) {
- MetaMethod metaMethod = new MetaMethod();
- metaMethod.setOrder(method.getAnnotation(AfterExecute.class).order());
- post.add(metaMethod);
- metaMethod.setMethod(method);
- }
- }
- }
-
- @Getter
- @SuppressWarnings("ClassCanBeRecord")
- public static class ModuleProxyInterceptor {
-
- private final List postHookMethods;
- private final List preHookMethods;
-
- public ModuleProxyInterceptor(List postHookMethods, List preHookMethods) {
- this.postHookMethods = postHookMethods;
- this.preHookMethods = preHookMethods;
- }
-
- @RuntimeType
- public Object intercept(@Origin Method method, @AllArguments Object[] allArguments, @SuperCall Callable> zuper, @This Object proxy) throws Exception {
- executeHookMethods(preHookMethods, proxy);
- Object res = zuper.call();
- executeHookMethods(postHookMethods, proxy);
- return res;
- }
-
- private void executeHookMethods(List hookMethods, Object proxy) {
- for (MetaMethod metaMethod : hookMethods) {
- Method m = metaMethod.getMethod();
- try {
- m.setAccessible(true);
- m.invoke(proxy);
- } catch (Exception e) {
- throw new ProxiedModuleRunningException("hook方法执行异常: " + m.getDeclaringClass() + "#" + m.getName(), e);
- }
- }
- }
-
- }
-
- record MethodsListRecord(List post, List pre) {
- public MethodsListRecord {
- post.sort(Comparator.comparingInt(MetaMethod::getOrder));
- pre.sort(Comparator.comparingInt(MetaMethod::getOrder));
- }
- }
}
diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/abstracts/AbstractAgentRunningModule.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/abstracts/AbstractAgentRunningModule.java
index 2c84eb41..313103da 100644
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/abstracts/AbstractAgentRunningModule.java
+++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/abstracts/AbstractAgentRunningModule.java
@@ -1,9 +1,7 @@
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.AgentRunningModule;
-import work.slhaf.partner.api.agent.factory.module.annotation.BeforeExecute;
import work.slhaf.partner.api.agent.factory.module.annotation.CoreModule;
import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowContext;
@@ -14,12 +12,11 @@ import work.slhaf.partner.api.agent.runtime.interaction.flow.entity.RunningFlowC
public abstract class AbstractAgentRunningModule extends AbstractAgentModule {
public abstract void execute(C context);
- @BeforeExecute
+ // TODO 重构注解扫描体系
private void beforeLog() {
log.debug("[{}] 模块执行开始...", getModuleName());
}
- @AfterExecute
private void afterLog() {
log.debug("[{}] 模块执行结束...", getModuleName());
}
diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java
deleted file mode 100644
index 96744262..00000000
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/AfterExecute.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package work.slhaf.partner.api.agent.factory.module.annotation;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 仅适用于以下类中的方法:
- * 1. @AgentRunningModule注解所在类
- * 2. ActivateModel子类
- * 3. AbstractAgentRunningModule或者AbstractAgentSubModule子类
- */
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface AfterExecute {
- int order() default 0;
-}
\ No newline at end of file
diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java
deleted file mode 100644
index f60e14fd..00000000
--- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/factory/module/annotation/BeforeExecute.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package work.slhaf.partner.api.agent.factory.module.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 仅适用于以下类中的方法:
- * 1. @AgentRunningModule注解所在类
- * 2. ActivateModel子类
- * 3. AbstractAgentRunningModule或者AbstractAgentSubModule子类
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface BeforeExecute {
- int order() default 0;
-}