`
niuzai
  • 浏览: 68234 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

运行时动态修改注解

 
阅读更多

      由于当前项目采用了分表策略,故一个实体会对应多个相同结构的表。只是映射的表名不一样而已~项目又使用憨包儿呢特,让我采用原生SQL总感觉不是那么爽,咋办呢?!第一念头就是如果能够动态映射就好啦,也就是现在想查table1只需将实体对应的table映射为table1即可。咋个实现动态映射呢?!也就是需要动态改变类的注解。又咋个能够动态改变类的注解呢?!本质上修改字节码,重新加载类即可,也就是所谓的字节码增强功能~  看都看不懂字节码咋个修改呢?!还是需要站在巨人的肩上才行。ASM以及JDK自带的字节码增强都不用,马上想到CGlib,javassist。。。还是痛苦的折腾了良久,为了大家不走我的弯路~ 直接上代码先~

 

public class ClassPoolUtils {
    
    
    /**
     * 动态ORM映射
     * 
     * @param entityClassName   待映射的实体全限定类名
     * @param tableName         待映射的表名
     * @return                  映射后的类对象
     */
    public static Class<?> tableMapping(String entityClassName, String tableName){
        Class<?> c = null;
        try {
            ClassPool classPool = ClassPool.getDefault();
            classPool.appendClassPath(new ClassClassPath(ClassPoolUtils.class));
            classPool.importPackage("javax.persistence");
            CtClass clazz = classPool.get(entityClassName);
            ClassFile classFile = clazz.getClassFile();
           
            System.out.println("增强前Entity01:" + clazz.getAnnotation(Entity.class));
            System.out.println("增强前Table02:" + clazz.getAnnotation(Table.class));
            
            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();
            
            System.out.println("增强后Entity001:" + clazz.getAnnotation(Entity.class));
            System.out.println("增强后Table002:" + clazz.getAnnotation(Table.class));
            //TODO 当前ClassLoader中必须尚未加载该实体。(同一个ClassLoader加载同一个类只会加载一次)
            c = clazz.toClass();
            System.out.println("增强后toClass-Entity0001:" + c.getAnnotation(Entity.class));
            System.out.println("增强后toClass-Table0002:" + c.getAnnotation(Table.class));
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return c;
    }

    public static void main(String[] args) {     
          ClassPoolUtils.tableMapping("com.andy.model.Order", "order1");
    }

 

   执行结果:

 

写道
增强前Entity01:@javax.persistence.Entity
增强前Table02:null
增强后Entity001:@javax.persistence.Entity
增强后Table002:@javax.persistence.Table(name="order1")
增强后toClass-Entity0001:@javax.persistence.Entity(name=)
增强后toClass-Table0002:@javax.persistence.Table(schema=, catalog=, uniqueConstraints=[], name=order1)
 
2
1
分享到:
评论

相关推荐

    java注解之运行时修改字段的注解值操作

    在实际开发中,我们经常需要在运行期修改注解的值,例如在导入 Excel 文件时,需要根据表头动态修改注解的值。下面是一个示例代码: ```java public class JavaVo { @Excel(name = "xxx") private String ...

    Spring @Scheduled定时任务动态修改cron参数

    `@Scheduled`注解是Spring Framework中用于创建定时任务的重要工具,它允许开发者在不重启应用的情况下,实现定时任务的动态配置,特别是修改cron表达式来调整执行周期。 在Spring中,定时任务主要通过`@Scheduled`...

    Java反射动态修改注解的某个属性值.Java

    需要注意的是,这种方法仅适用于那些在运行时需要动态修改注解属性的特殊场景,因为这并不是Java设计的一部分,可能会引起混淆和不可预测的行为。在大多数情况下,注解的目的是提供编译时和构建时的元数据,而非运行...

    SpringBoot+mybatis+Druid 运行时动态多数据源

    SpringBoot、MyBatis和Druid的组合提供了一个高效且灵活的解决方案,尤其是在实现运行时动态多数据源方面。本篇文章将深入探讨如何利用这些技术来实现这一目标。 首先,**SpringBoot** 是一个基于Spring框架的高度...

    自定义注解实现伪动态传参的小demo

    在Java编程语言中,注解(Annotations)是一种元数据,用于提供有关代码的信息,这些信息可以被编译器或运行时环境使用。自定义注解是扩展Java功能的强大工具,可以用于实现各种目的,如代码生成、编译时检查、运行...

    java 动态修改Properties,src下或者指定路径

    在Java编程中,有时我们需要在运行时动态地修改配置文件,比如Properties文件。Properties文件是Java用来存储配置信息的一种常见方式,通常包含了应用的各种参数设置。然而,一旦将应用程序打包成JAR,内部的资源...

    吴天雄-Java注解及动态性详解.doc

    3. 动态Java字节码操作:通过ASM、Javassist等库,可以在运行时生成、修改或分析字节码,实现动态代码生成和热修复等功能。 总的来说,Java注解和动态性极大地扩展了Java的应用场景,提高了代码的灵活性和可维护性...

    动态代理和注解Spring.rar

    而CGLIB代理则是在运行时动态生成子类来实现,适用于目标对象没有接口或者接口不完全满足需求的情况。理解动态代理的工作原理,以及何时选择哪种代理方式,对于优化Spring应用的性能和可维护性至关重要。 其次,...

    如何修改动态库符号表1

    需要注意的是,不恰当的修改可能导致程序无法正常运行,因此在操作时应谨慎并充分理解ELF文件格式和动态库的工作原理。 总结来说,修改动态库符号表涉及对ELF文件结构的深入理解和利用特定工具进行操作。这在特定的...

    编译时注解示例

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器或JVM提供信息的方式,这些信息可以用于代码分析、编译时检查或者运行时处理。注解在程序源代码中以“@”符号开头,后面跟着注解的类型。本示例...

    myeclipse注释模板的修改 自动生成注释

    本篇文章将详细解析如何在MyEclipse中修改注释模板,实现自动生成符合个人或团队编码规范的注释。 首先,我们来理解一下什么是注释模板。在编程中,注释是用来解释代码功能、用途以及编写逻辑的文字,对于代码的...

    Spring的定时器动态修改参数cron的值

    要实现动态修改cron表达式的功能,我们可以利用Spring的`ThreadPoolTaskScheduler`或`ConcurrentTaskScheduler`,它们都支持在运行时调整任务的调度。这里我们以`ThreadPoolTaskScheduler`为例: 1. 首先,我们需要...

    Android-一个android或java项目的编译时注解动态代理库

    本文将深入探讨"Android-一个android或java项目的编译时注解动态代理库"这一主题,帮助开发者理解如何利用此类库提升项目效率。 首先,注解是一种元数据,它允许程序员在源代码中添加额外的信息,这些信息可以在...

    java修改class文件工具jbe

    5. **字节码操作技巧**:使用 JBE 进行字节码操作时,需要注意保持字节码的合法性和平衡性,因为错误的修改可能导致程序无法运行。此外,修改后的字节码可能需要重新签名,尤其是当涉及到类加载器或安全权限时。 6....

    无法运行安卓版贪吃蛇游戏内容较丰富能够运行代码简单又注释哦.rar

    这个压缩包文件“无法运行安卓版贪吃蛇游戏内容较丰富能够运行代码简单又注释哦.rar”似乎包含了一个尝试开发或调试的安卓版贪吃蛇游戏项目。根据描述,这个项目可能包含了丰富的功能和代码,但由于没有提供具体的...

    反射-动态代理-注解

    通过注解标记切点,再利用反射和动态代理在运行时生成代理对象,实现方法拦截,从而实现事务管理、日志记录等功能。此外,注解还可以用于配置管理,简化XML配置,提高代码可读性和维护性。 总之,反射、动态代理和...

    WOA源码+注释+微修改版本+源论文

    在这个压缩包文件中,你将找到WOA的源代码以及相关的注释和修改版本,这对于初学者深入理解算法原理和实践应用非常有帮助。 首先,WOA的核心思想模拟了座头鲸群体的两种主要捕食行为:一是Vortex(涡旋)策略,模拟...

    动态代理加注解实现细粒度的权限管理,具体到方法(前面上传的资源修改)

    动态代理可以在运行时创建一个实现了特定接口的新类,这个新类会在调用每个接口方法时执行额外的逻辑,如日志记录、事务管理或者——就像在这个例子中——权限检查。当我们无法提前知道所有可能的代理类,或者需要在...

    json的动态和静态过滤

    动态过滤则是在运行时根据条件决定要过滤的字段。这通常发生在服务器接收到请求后,根据请求参数或用户权限来决定返回哪些字段。在Java中,如果使用Jackson库,可以使用`ObjectMapper`的`setSerializationInclusion...

    运用javassist和annotation修改class的特定method的class byte code

    Javaassist是一个开源库,它允许...总之,Javaassist结合注解提供了一种强大的工具,让我们能够在运行时动态地修改Java类的行为。尽管这需要对字节码和反射有深入的理解,但一旦掌握,就能极大地增强我们的编程灵活性。

Global site tag (gtag.js) - Google Analytics