All Downloads are FREE. Search and download functionalities are using the official Maven repository.

top.gotoeasy.framework.spring.aop.enhance.generate.Src92EnhanceSuperClassCreater Maven / Gradle / Ivy

Go to download

基于JavaCompiler的继承方式AOP实现,在性能优良的基础上,提供更多的简易性,2.x.x版本集成使用Spring容器

The newest version!
package top.gotoeasy.framework.spring.aop.enhance.generate;

import org.springframework.beans.factory.annotation.Autowired;

import lombok.extern.slf4j.Slf4j;
import top.gotoeasy.framework.spring.aop.args.AopContext;
import top.gotoeasy.framework.spring.aop.args.Enhance;
import top.gotoeasy.framework.spring.aop.args.SuperInvoker;
import top.gotoeasy.framework.spring.aop.util.AopUtil;

/**
 * 增强中间类代码生成类
 * 
 * @since 2018/01
 * @author 青松
 */
@Slf4j
public class Src92EnhanceSuperClassCreater {

    private static final String TAB1 = "    ";

    private DataBuilderVars dataBuilderVars;
    private Src00ConstructorCreater src00ConstructorCreater;
    private Src21AroundMethodCreater src21AroundMethodCreater;

    /**
     * 构造方法
     * 
     * @param dataBuilderVars 公用变量
     */
    public Src92EnhanceSuperClassCreater(DataBuilderVars dataBuilderVars) {
        this.dataBuilderVars = dataBuilderVars;
        this.src00ConstructorCreater = new Src00ConstructorCreater(dataBuilderVars);
        this.src21AroundMethodCreater = new Src21AroundMethodCreater(dataBuilderVars);
    }

    /**
     * 创建环绕拦截中间类源码
     * 
     * @param max 中间类最大数
     * @param seq 中间类序号
     * @return 环绕拦截中间类源码
     */
    public String createAroundMiddleClassCode(int max, int seq) {
        StringBuilder sbMethodField = new StringBuilder();
        StringBuilder sbSuperInvokerField = new StringBuilder();
        StringBuilder sbAopField = new StringBuilder();

        if (seq == 0) {
            // protected Method varMethod
            dataBuilderVars.methodFieldMap.keySet().forEach(method -> sbMethodField.append(TAB1)
                    .append("protected Method ").append(dataBuilderVars.methodFieldMap.get(method)).append(";\n"));
            // protected SuperInvoker varSuperInvoker
            dataBuilderVars.superInvokerFieldMap.keySet()
                    .forEach(method -> sbSuperInvokerField.append(TAB1).append("protected SuperInvoker ")
                            .append(dataBuilderVars.superInvokerFieldMap.get(method)).append(";\n"));
            // public {aopClass} varAopObj
            dataBuilderVars.aopClassFieldMap.keySet()
                    .forEach(aopClass -> sbAopField.append(TAB1).append("@Autowired\n").append(TAB1).append("public")
                            .append(" ").append(aopClass.getName()).append(" ")
                            .append(dataBuilderVars.aopClassFieldMap.get(aopClass)).append(";\n"));
        }

        // AroundMethod
        StringBuilder sbAroundMethod = src21AroundMethodCreater.getAroundMethodSrc(seq);
        // SuperInvoker
        StringBuilder sbSuperInvoker = src21AroundMethodCreater.getSuperInvokerInitSrc(seq);
        // Class
        StringBuilder sbClass = new StringBuilder();
        // -------------------------------------------------------------------------
        // package ....
        //
        // import ....
        // import ....
        //
        // public class superClass$$gotoeasy$$AroundBase extends superClass implements
        // Enhance ...
        //
        // methodField...
        // superInvokerField...
        // aopObjField...
        //
        // method...
        // -------------------------------------------------------------------------
        sbClass.append("package ").append(dataBuilderVars.targetClass.getPackage().getName()).append(";\n");
        sbClass.append("\n");
        sbClass.append("import java.lang.reflect.Method;").append("\n");
        sbClass.append("import " + AopUtil.class.getName() + ";").append("\n");
        sbClass.append("import " + Enhance.class.getName() + ";").append("\n");
        sbClass.append("import " + SuperInvoker.class.getName() + ";").append("\n");
        sbClass.append("import " + AopContext.class.getName() + ";").append("\n");
        sbClass.append("import " + Autowired.class.getName() + ";").append("\n");
        sbClass.append("\n");
        if (seq == 0) {
            sbClass.append("public class ")
                    .append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq))
                    .append(" extends ").append(dataBuilderVars.targetClass.getSimpleName())
                    .append(" implements Enhance {").append("\n");
        } else {
            sbClass.append("public class ")
                    .append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq))
                    .append(" extends ")
                    .append(AopUtil.getAroundMiddleClassSimpleName(dataBuilderVars.targetClass, max, seq - 1))
                    .append(" {").append("\n");
        }
        sbClass.append("\n");
        sbClass.append(sbMethodField);
        sbClass.append(sbSuperInvokerField);
        sbClass.append(sbAopField);
        sbClass.append("\n");
        sbClass.append(src00ConstructorCreater.getConstructorSrc(max, seq, sbSuperInvoker));
        sbClass.append("\n");
        sbClass.append(sbAroundMethod);
        sbClass.append("}").append("\n");

        String srcCode = sbClass.toString();
        log.trace("\n{}", srcCode);
        return srcCode;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy