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 ...
随机推荐
- [ python ] FTP作业进阶
作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...
- Linux打补丁的一些问题
linuxpatchlinux内核文档commandheader类unix操作系统有一个很有趣的特性就是源代码级的补丁包.在windows上我们打补丁都是运行一个可执行的程序,然后就可以把补丁打完了, ...
- web 端 gantt组件选型
gantt - 甘特图 甘特图(Gantt chart)又称为横道图.条状图(Bar chart).其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况.以提出者亨利·L ...
- windows 下 nginx 配置虚拟主机
1. 在 nginx 的配置文件 nginx.conf 里面 引入虚拟主机配置文件,以后所有的虚拟主机配置文件都在写这个文件里 include vhost.conf; (或者新建vhost ...
- 邀请用户进TestFlight 体验 App 的测试版本
iphone手机用户,在工作中常见到,APP版本现在是Beta阶段(iOS版本),需要邀请一些用户来体验新版本,在版本上线前提出更好的建议及时进行修改,此时用到了testflight,很方便的通过邀请 ...
- Java 中的值传递和引用传递问题
Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; ...
- ie6 css 返回顶部图标固定在浏览器右下角
比较常用记录一下. #e_float{ _position:absolute; _bottom:auto; _right:50%; _margin-right:-536px; _top:express ...
- js的循环
1.for(){} 这种方法可能每个人都用过,不多说. 2.ES5的forEach myArray.forEach(function (value) { console.log(value); }); ...
- 洛谷——P2559 [AHOI2002]哈利·波特与魔法石
P2559 [AHOI2002]哈利·波特与魔法石 题目描述 输入输出格式 输入格式: 文件中第一行有七个数,分别是 S1. S2 . …. S7 :第二行有两个数,依次分别是起点城市 i 和终点城市 ...
- Openstack关于Regions和Availability Zones
在AWS中有Region和Availability Zones的概念,并且在openstack中也实现了两者,只是不太容易看出来. 此文主要介绍他们的概念和关系,以及在openstack中的实现. 如 ...