zoukankan      html  css  js  c++  java
  • cglib源码分析(三):Class生成策略

    cglib中生成类的工作是由AbstractClassGenerator的create方法使用相应的生成策略完成,具体代码如下:

    private GeneratorStrategy strategy = DefaultGeneratorStrategy.INSTANCE;
    byte[] b = strategy.generate(this);

    GeneratorStrategy是一个接口,它负责调用ClassGenerator 的generateClass方法来生成类。DefaultGeneratorStrategy是cglib提供的一个默认的生成策略,部分代码如下:

    public class DefaultGeneratorStrategy implements GeneratorStrategy {
        public static final DefaultGeneratorStrategy INSTANCE = new DefaultGeneratorStrategy();
        
        public byte[] generate(ClassGenerator cg) throws Exception {
            DebuggingClassWriter cw = getClassVisitor();
            transform(cg).generateClass(cw);
            return transform(cw.toByteArray());
        }
    
        protected DebuggingClassWriter getClassVisitor() throws Exception {
          return new DebuggingClassWriter(ClassWriter.COMPUTE_MAXS);
        }
    ... ...
    protected byte[] transform(byte[] b) throws Exception { return b; } protected ClassGenerator transform(ClassGenerator cg) throws Exception { return cg; } }

    DefaultGeneratorStrategy实现了ClassGenerator接口,并提供两个transform方法。用户可以通过继承DefaultGeneratorStrategy并重写相关的方法来检查或者修改生成类。

    类生成策略和命名策略一样,使用了策略设计模式,用户可以通过实现GeneratorStrategy接口来自定义生成策略,并使用AbstractClassGenerator的setStrategy方法来设置自定义策略。

  • 相关阅读:
    1136 A Delayed Palindrome (20 分)(回文数)
    1117 Eddington Number (25 分)(简单逻辑)
    1094 The Largest Generation (25 分)(BFS,DFS树的遍历)
    1079 Total Sales of Supply Chain (25 分)(dfs,bfs,树的遍历)
    还原前端代码js.map
    构造表单任意文件上传
    Python搭建HTTP服务
    C# 递归算法
    foreach小结
    判断一个点是否在一个区域中
  • 原文地址:https://www.cnblogs.com/cruze/p/3862891.html
Copyright © 2011-2022 走看看