zoukankan      html  css  js  c++  java
  • 动态修改类注解(赋值)

       1. 动态修改注解元凶:

           

    Java代码 
    /** 
     * 对象池工具类 
     *  
     * 目前提供ORM动态映射解决方案 
     *  
     * @author andy.zheng 
     * @since 2012.09.25 15:55 PM 
     * @vesion 1.0 
     *  
     */ 
    public class ClassPoolUtils {  
          
          
        /** 
         * 运行时动态ORM表映射 
         *  
         *  
         * @param entityClassName   待映射的实体全限定类名 
         * @param tableName         待映射的表名 
         * @return                  映射后的类对象 
         */ 
        public static Class<?> tableMapping(String entityClassName, String tableName){  
            Class<?> c = null;  
              
            if(StringUtils.isEmpty(entityClassName) || StringUtils.isEmpty(tableName)){  
                throw new IllegalArgumentException("The mapping parameter is invalid!");  
            }  
              
            try {  
                ClassPool classPool = ClassPool.getDefault();  
                classPool.appendClassPath(new ClassClassPath(ClassPoolUtils.class));  
                classPool.importPackage("javax.persistence");  
                CtClass clazz = classPool.get(entityClassName);  
                clazz.defrost();  
                ClassFile classFile = clazz.getClassFile();  
                 
                ConstPool constPool = classFile.getConstPool();  
                Annotation tableAnnotation = new Annotation("javax.persistence.Table", constPool);  
                tableAnnotation.addMemberValue("name", new StringMemberValue(tableName, constPool));  
                // 获取运行时注解属性  
                AnnotationsAttribute attribute = (AnnotationsAttribute)classFile.getAttribute(AnnotationsAttribute.visibleTag);  
                attribute.addAnnotation(tableAnnotation);  
                classFile.addAttribute(attribute);  
                classFile.setVersionToJava5();  
                //clazz.writeFile();  
                  
                //TODO 当前ClassLoader中必须尚未加载该实体。(同一个ClassLoader加载同一个类只会加载一次)  
                //c = clazz.toClass();  
                EntityClassLoader loader = new EntityClassLoader(ClassPoolUtils.class.getClassLoader());  
                c = clazz.toClass(loader , null);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
         &nbsp;    
            return c;  
        }    
     
        public static void main(String[] args) {  
            Class<?> clazz = ClassPoolUtils.tableMapping("com.andy.model.order.Order", "order1");  
            System.out.println("修改后的@Table: " + clazz.getAnnotation(Table.class));  
        }  

     2. PO类加载器:

    Java代码 
    /** 
     * 实体类加载器 *  
     * 该加载器主要用于运行时动态修改实体后,重新装载实体 
     *  
     * @author andy.zheng 
     * @since 2012.09.25 16:18 PM 
     * @vesion 1.0 
     * 
     */ 
    public class EntityClassLoader extends ClassLoader {  
          
        private ClassLoader parent;  
          
        public EntityClassLoader(ClassLoader parent){  
            this.parent = parent;  
        }  
           
        @Override 
        public Class<?> loadClass(String name) throws ClassNotFoundException {  
            return this.loadClass(name, false);  
        }  
          
        @Override 
        protected synchronized Class<?> loadClass(String name, boolean resolve)  
                throws ClassNotFoundException {  
            Class<?> clazz = this.findLoadedClass(name);  
            if(null != parent){  
                clazz = parent.loadClass(name);  
            }    
            if(null == clazz){  
                this.findSystemClass(name);  
            }  
              
            if(null == clazz){  
                throw new ClassNotFoundException();  
            }  
            if(null != clazz && resolve){  
                this.resolveClass(clazz);  
            }  
              
            return clazz;  
        }  

        /** 
         * @param args 
         */ 
        public static void main(String[] args) {  
     
        }  
     

       3. 将最新映射对象交给Hibernate吧~ 当然这个东东当然在Dao层哈,需要覆盖hibernate初始化默认加载的映射对象。你可以把它正在诸如BaseHiberanteDao中,在需要动态映射表名的时候,先调它一把,然后再写你的HQL.当然如果接口统一的话,你也可以玩高级一点的。(为需要动态映射的接口代理一下,悄无声息的动态映射一把!!!可谓是神不知鬼不觉~),

        /**
         * 运行时动态ORM表映射
         *
         * @param tableMapping  映射集合
         *                      key - 待映射的表名 value - 待映射的实体对象
         */
        @SuppressWarnings("unused")
        protected void tableMapping(Map<String, Class<?>> tableMapping){
            Assert.notEmpty(tableMapping , "The mapping parameter is empty!");
            for (String tableName : tableMapping.keySet()) {
                Class<?> entityClass = tableMapping.get(tableName);
                String className = entityClass.getName();
                ClassMetadata metadata = this.getSessionFactory().getClassMetadata(className);
                Class<?> mappedClass = metadata.getMappedClass();
                mappedClass = ClassPoolUtils.tableMapping(className, tableName);
            }
        }

       调用例子:

      

    Java代码 
    public Page<OrderDetail> getList(int currentPage , int pageSize){  
       this.tableMapping(new HashMap(){  
          {  
                    this.put("orderdetail1", OrderDetail.class);  
           }  
       });  
      Page<OrderDetail> page = this.<OrderDetail>pagingList("", currentPage , pageSize);  
      Assert.notEmpty(page.getItems());  
      return page;  

       执行语句:

      

      

    Sql代码 
    Hibernate: select count(*) as col_0_0_ from OrderDetail orderdetai0_  
    Hibernate: select orderdetai0_.id as id15_, orderdetai0_.docid as docid15_, orderdetai0_.ErrorDesc as ErrorDesc15_, orderdetai0_.insertedtime as inserted3_15_, orderdetai0_.OrderID as OrderID15_, orderdetai0_.ordernum as ordernum15_, orderdetai0_.SegmentsIDs as Segments5_15_, orderdetai0_.selltype as selltype15_, orderdetai0_.status as status15_ from OrderDetail orderdetai0_ 

  • 相关阅读:
    分布式系统中的Session问题
    HotSpot VM运行时---命令行选项解析
    K大数查询
    [DarkBZOJ3636] 教义问答手册
    小朋友和二叉树
    [COCI2018-2019#2] Sunčanje
    小SY的梦
    [HDU6722 & 2019百度之星初赛四 T4] 唯一指定树
    [HDU6800] Play osu! on Your Tablet
    [NOI2007] 货币兑换
  • 原文地址:https://www.cnblogs.com/cunkouzh/p/4924504.html
Copyright © 2011-2022 走看看