JAVAssist---动态改动注解
ITOOV3.0開始了,须要研究一些技术难点,先来说一个我认为比較有趣的技术点吧。需求是这种。我们须要动态的切换数据源,又因为我们是通过实体单元的注入来完毕的。实体单元是通过注解的形式注入的。这样假设我们想改动数据源那么必定就要动态的改动注解(当然可能还有其它的解决方案,可是我认为动态改动注解还是非常有趣的)所以就从动态改动注解開始吧:
/**
* EntityManager的实例化
* @author 陈丽娜
* @version 1.0.0 , 2015年3月30日 下午8:43:27
* @param <T>
*/
public class CollectionBase<T> extends BaseEaoImpl<T> {
/**
* 注入实体单元
*/
@PersistenceContext(unitName="collection-entity")
protected EntityManager em;
/**EntityManger
* 实例化
*/
@Override
protected EntityManager getEntityManager() {
return this.em;
}
}
更深入的认识能够百度了解一下。以下一个小的demo来改动一下注解:
首先来看是怎样获得这个注解的:
@Test
public void ReadTest() throws NotFoundException{
ClassPool pool = ClassPool.getDefault();
//获取要改动的类的全部信息
CtClass ct = pool.get("com.tgb.itoo.collection.base.CollectionBase");
//获取类中的方法
CtMethod[] cms = ct.getDeclaredMethods();
//获取第一个方法(由于仅仅有一个方法)
CtMethod cm = cms[0];
System.out.println("方法名称====" + cm.getName());
//获取方法信息
MethodInfo methodInfo = cm.getMethodInfo();
//获取类里的em属性
CtField cf = ct.getField("em");
//获取属性信息
FieldInfo fieldInfo = cf.getFieldInfo();
System.out.println("属性名称===" + cf.getName()); //获取注解属性
AnnotationsAttribute attribute = (AnnotationsAttribute) fieldInfo.getAttribute(AnnotationsAttribute.visibleTag);
System.out.println(attribute);
//获取注解
Annotation annotation = attribute.getAnnotation("javax.persistence.PersistenceContext");
System.out.println(annotation);
//获取注解的值
String text =((StringMemberValue) annotation.getMemberValue("unitName")).getValue() ;
System.out.println("注解名称===" + text); }
方法名称====getEntityManager
属性名称===em
@javax.persistence.PersistenceContext(unitName="collection-entity")
@javax.persistence.PersistenceContext(unitName="collection-entity")
注解名称===collection-entity
@Test
public void UpdateTest() throws NotFoundException{
ClassPool pool = ClassPool.getDefault();
//获取须要改动的类
CtClass ct = pool.get("com.tgb.itoo.collection.base.CollectionBase"); //获取类里的全部方法
CtMethod[] cms = ct.getDeclaredMethods();
CtMethod cm = cms[0];
System.out.println("方法名称====" + cm.getName()); MethodInfo minInfo = cm.getMethodInfo();
//获取类里的em属性
CtField cf = ct.getField("em");
FieldInfo fieldInfo = cf.getFieldInfo(); System.out.println("属性名称===" + cf.getName()); ConstPool cp = fieldInfo.getConstPool();
//获取注解信息
AnnotationsAttribute attribute2 = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag);
Annotation annotation = new Annotation("javax.persistence.PersistenceContext", cp); //改动名称为unitName的注解
annotation.addMemberValue("unitName", new StringMemberValue("basic-entity", cp));
attribute2.setAnnotation(annotation);
minInfo.addAttribute(attribute2); //打印改动后方法
Annotation annotation2 = attribute2.getAnnotation("javax.persistence.PersistenceContext");
String text = ((StringMemberValue)annotation2.getMemberValue("unitName")).getValue(); System.out.println("改动后的注解名称===" + text);
}
方法名称====getEntityManager
属性名称===em
改动后的注解名称===basic-entity
JAVAssist---动态改动注解的更多相关文章
- Flume NG源代码分析(二)支持执行时动态改动配置的配置模块
在上一篇中讲了Flume NG配置模块主要的接口的类,PropertiesConfigurationProvider提供了基于properties配置文件的静态配置的能力,这篇细说一下PollingP ...
- ListCtrl 控件数据动态改动
參考文章:ListCtrl 控件数据动态改动 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDIzNjU1MA==/font/5a6L5L2T/f ...
- Mybatis 动态SQL注解 in操作符的用法
在SQL语法中如果我们想使用in的话直接可以像如下一样使用: ,,) ; ,,) ; 但是如果在MyBatis中的使用 in 操作符,像下面这样写的话,肯定会报错: @Update("upd ...
- Java安全之Javassist动态编程
Java安全之Javassist动态编程 0x00 前言 在调试CC2链前先来填补知识盲区,先来了解一下Javassist具体的作用.在CC2链会用到Javassist以及PriorityQueue来 ...
- Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能
前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...
- Mybatis:缓存,动态SQL,注解SQL以及动态标签使用
1 转义字符 字符 转义 描述 < < 小于 <= <= 小于等于 > > 大于 >= >= 大于等于 <> <> 不等于 &a ...
- JDK动态代理+反射实现动态修改注解属性值
这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~ 一.准备自定义注解 注:如何实现自定义注解,请移步百度. 二.实现 1.实现方式1:通过反射+动态代理动态 ...
- Java javassist动态代理
package org.windwant.spring.core.proxy; import javassist.ClassPool; import javassist.CtClass; import ...
- javassist动态修改class
import java.io.IOException;import java.io.PrintWriter; import javassist.CannotCompileException;impor ...
随机推荐
- mysql 数据库备份及恢复
1.备份 # 导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -–add-drop-table -uusername -ppassword da ...
- POJ2528 Mayor's posters(线段树染色问题+离散化)
题目大意:有t组数据,每组数据给你n张海报(1<=n<=10000),下面n组数据分别给出每张海报的左右范围(1 <= l <= r <= 10000000),下一张海报 ...
- scala学习6--collection
list的下标访问 var t = List(1,2,3,5,5) println(t(2)) map函数 println(t.map(a=> {print("***"+a ...
- opencv的CMakeLists.txt与makefile写法
opencv的CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(my_run_name) find_package(OpenCV R ...
- python合并图片
因项目需求需要将图片合并故写了一个python脚本,在这里放个笔记 #!/usr/bin/env python #coding=utf-8 import Image import os import ...
- 关于node.js的模块查找顺序(require.resolve())
前几天社团群里有人问了阿里秋季前端笔试的一道题,想起来以前在官方文档看到过查找模块的算法,干脆自己写一写…… 官方的require.resolve实现在这里. 因为我只是想看看查找过程,所以就直接把会 ...
- c#中值类型和引用类型的区别
1. 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 2. 值类型存取速度快,引用类型存取速度慢. 3. 值类型表示实际数据,引 ...
- NIO-1缓冲区(Buffer)
import java.nio.ByteBuffer; import org.junit.Test; /* * 一.缓冲区(Buffer):在 Java NIO 中负责数据的存取.缓冲区就是数组.用于 ...
- Java学习(API及Object类、String类、StringBuffer字符串缓冲区)
一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就 ...
- PHP 文件夹操作「复制、删除、查看大小、重命名」递归实现
PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...