xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/beans/BladeBeanMap.java
对比新文件
@@ -0,0 +1,125 @@
package org.springblade.core.tool.beans;
import org.springframework.asm.ClassVisitor;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.cglib.core.AbstractClassGenerator;
import org.springframework.cglib.core.ReflectUtils;
import java.security.ProtectionDomain;
/**
 * 閲嶅啓 cglib BeanMap锛屾敮鎸侀摼寮廱ean
 *
 * @author L.cm
 */
public abstract class BladeBeanMap extends BeanMap {
   protected BladeBeanMap() {
   }
   protected BladeBeanMap(Object bean) {
      super(bean);
   }
   public static BladeBeanMap create(Object bean) {
      BladeGenerator gen = new BladeGenerator();
      gen.setBean(bean);
      return gen.create();
   }
   /**
    * newInstance
    *
    * @param o Object
    * @return BladeBeanMap
    */
   @Override
   public abstract BladeBeanMap newInstance(Object o);
   public static class BladeGenerator extends AbstractClassGenerator {
      private static final Source SOURCE = new Source(BladeBeanMap.class.getName());
      private Object bean;
      private Class beanClass;
      private int require;
      public BladeGenerator() {
         super(SOURCE);
      }
      /**
       * Set the bean that the generated map should reflect. The bean may be swapped
       * out for another bean of the same type using {@link #setBean}.
       * Calling this method overrides any value previously set using {@link #setBeanClass}.
       * You must call either this method or {@link #setBeanClass} before {@link #create}.
       *
       * @param bean the initial bean
       */
      public void setBean(Object bean) {
         this.bean = bean;
         if (bean != null) {
            beanClass = bean.getClass();
         }
      }
      /**
       * Set the class of the bean that the generated map should support.
       * You must call either this method or {@link #setBeanClass} before {@link #create}.
       *
       * @param beanClass the class of the bean
       */
      public void setBeanClass(Class beanClass) {
         this.beanClass = beanClass;
      }
      /**
       * Limit the properties reflected by the generated map.
       *
       * @param require any combination of {@link #REQUIRE_GETTER} and
       *                {@link #REQUIRE_SETTER}; default is zero (any property allowed)
       */
      public void setRequire(int require) {
         this.require = require;
      }
      @Override
      protected ClassLoader getDefaultClassLoader() {
         return beanClass.getClassLoader();
      }
      @Override
      protected ProtectionDomain getProtectionDomain() {
         return ReflectUtils.getProtectionDomain(beanClass);
      }
      /**
       * Create a new instance of the <code>BeanMap</code>. An existing
       * generated class will be reused if possible.
       *
       * @return {BladeBeanMap}
       */
      public BladeBeanMap create() {
         if (beanClass == null) {
            throw new IllegalArgumentException("Class of bean unknown");
         }
         setNamePrefix(beanClass.getName());
         BladeBeanMapKey key = new BladeBeanMapKey(beanClass, require);
         return (BladeBeanMap) super.create(key);
      }
      @Override
      public void generateClass(ClassVisitor v) throws Exception {
         new BladeBeanMapEmitter(v, getClassName(), beanClass, require);
      }
      @Override
      protected Object firstInstance(Class type) {
         return ((BeanMap) ReflectUtils.newInstance(type)).newInstance(bean);
      }
      @Override
      protected Object nextInstance(Object instance) {
         return ((BeanMap) instance).newInstance(bean);
      }
   }
}