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 ...
随机推荐
- 基于TCP协议的聊天室控制台版
我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...
- admin组件详解
admin组件详解 先根据admin组件启动流程复习下django项目启动至请求过来发生的事 1将admin组件注册进app 2django项目启动 3在运行到定制的admin时执行其下面的apps文 ...
- scrapy抓取小说
用scrapy建立一个project,名字为Spider scrapy startproject Spider 因为之前一直用的是电脑自带的python版本,所以在安装scrapy时,有很多问题,也没 ...
- 快速地从Redhat系转Ubuntu系
ubuntu官网的,https://help.ubuntu.com/community/SwitchingToUbuntu/FromLinux/RedHatEnterpriseLinuxAndFedo ...
- [前端随笔][css] 弹性布局
说在前面 弹性布局,顾名思义就是有弹性,能够根据屏幕/当前空间大小自由伸缩的.使用弹性布局可以很好的适应各种尺寸的客户端. 关键代码 display:flex; 设定元素为弹性布局 <文档传送门 ...
- 响应式之像素和viewport
引言 按照pc尺寸做好的网页,在手机端打开,看起来像是pc的缩小版,东西都在只是字太小都看不清了,有什么办法放大呢? 于是去google一下,发现,贴了这么一行代码就轻松解决了: <meta n ...
- [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器
发布日期:2008.11.2 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 今天Artech兄在<关于Type Init ...
- 【LOJ】#2544. 「JXOI2018」游戏
题解 九条可怜还有那么善良的一面??? 显然有些数在这个区间里没有数是它的约数,它们其中的最后一个取的一定就是\(t(p)\)的值 这样我们只需要枚举\(t(p)\)的值,这个值就是"没有任 ...
- Python全栈开发之2、运算符与基本数据结构
运算符 一.算数元算: 读者可以跟着我按照下面的代码重新写一遍,其中需要注意的是,使用除的话,在python3中可以直接使用,结果是4没有任何问题,但是在python2中使用的话,则不行,比如 9/2 ...
- 在Linux中设置UMASK值
umask值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的. 对于root用户,系统默认的umask值是0022:对于普通用户, ...