JDK动态代理+反射实现动态修改注解属性值
这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~
一、准备自定义注解

注:如何实现自定义注解,请移步百度。
二、实现
1、实现方式1:通过反射+动态代理动态修改自定义注解的属性

public class ModifyAnnotaionFactory {
private static ModifyAnnotaionFactory instance = null;
public static ModifyAnnotaionFactory newInstance()
{
if (instance == null)
{
synchronized (ModifyAnnotaionFactory.class)
{
if (instance == null)
{
instance = new ModifyAnnotaionFactory();
}
}
}
return instance;
}
private ModifyAnnotaionFactory(){}
/**
*
* @param className 当前类名.class
* @param annotationName 需要修改的注解class
* @param methodName 需要修改的方法名
* @param modifyField 注解中需要修改的属性名
* @param paramName 注解中修改的属性值
* @param paramTypes 不定参数----语法糖
*/
public Annotation ModifyAnnotation(Class className,Class annotationName,
String methodName,String modifyField,String paramName,Class<?>... paramTypes)
{
try
{
//反射获取Method:methodName方法、paramTypes不定参数(“语法糖”)-----method
Method method = className.getDeclaredMethod(methodName,paramTypes);
//反射当前方法的注解---annotation
Annotation annotation = method.getAnnotation(annotationName);
//获取该注解的调用处理器---invocationHandler
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
//反射获取注解的属性
Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
//暴力破解
memberValues.setAccessible(true);
//获取所有的注解属性--map集合
Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
//覆盖原有属性值
values.put(modifyField, paramName);
return annotation;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param classAllPath 当前类的全路径名
* @param annotationName 需要修改的注解class
* @param methodName 需要修改的方法名
* @param modifyField 注解中需要修改的属性名
* @param paramName 注解中修改的属性值
* @return
*/
public boolean ModifyAnnotation(String classAllPath,Class annotationName,String methodName,String modifyField,String paramName)
{
try
{
Class<?> aClass = Class.forName(classAllPath);
Method method = aClass.getDeclaredMethod(methodName);
Annotation annotation = method.getAnnotation(annotationName);
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
memberValues.setAccessible(true);
Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
Object o1 = values.get(modifyField);
values.put(modifyField, paramName);
Object o2 = values.get(modifyField);
System.out.println();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 获取当前注解
* @param className 当前类名
* @param annotationName 注解名
* @param name 方法名、类名、属性名之一
* @param type 注解类型
* @return
* @throws Exception
*/
public Annotation getAnnotation(Class className,Class annotationName,String name,Integer type) throws Exception {
switch (type){
case 1:
Method method = className.getDeclaredMethod(name);
return method.getAnnotation(annotationName);
case 2:
System.out.println("2");
return null;
case 3:
System.out.println("3");
return null;
}
return null;
}
工具类
测试结果如下:

2、实现方式2:
JDK动态代理+反射实现动态修改注解属性值的更多相关文章
- Java反射之Bean修改更新属性值等工具类
package com.bocean.util; import java.lang.annotation.Annotation; import java.lang.reflect.Field; imp ...
- 杨晓峰-Java核心技术-6 动态代理 反射 MD
目录 第6讲 | 动态代理是基于什么原理? 典型回答 考点分析 知识扩展 反射机制及其演进 动态代理 精选留言 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAnd ...
- 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式
从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...
- 代理模式详解:静态代理、JDK动态代理与Cglib动态代理
代理模式简介分类 概念 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...
- JDK 动态代理与 CGLIB 动态代理,它俩真的不一样
摘要:一文带你搞懂JDK 动态代理与 CGLIB 动态代理 本文分享自华为云社区<一文带你搞懂JDK 动态代理与 CGLIB 动态代理>,作者: Code皮皮虾 . 两者有何区别 1.Jd ...
- 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理
Spring AOP详解 . JDK动态代理.CGLib动态代理 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...
- jdk动态代理与cglib动态代理例子
1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...
- Java代理(静态代理、JDK动态代理、CGLIB动态代理)
Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...
随机推荐
- linux 安装 Django14
一.实际安装过程(只操作这一步就可以安装) ## 下载并安装 rpm -ivh http://cbs.centos.org/kojifiles/packages/Django14/1.4.20/1.e ...
- Matlab的sort函数
1.Matlab自带排序函数sort用法 [Y,I] = sort(X,DIM,MODE) sort函数默认Mode为'ascend'为升序,sort(X,'descend')为降序排 ...
- Java selenium下拉滚动页面
Selenium强大之处在于,可以操作模拟键盘和点击页面的任何结构,本文对于Selenium的视图滚动操作方法进行解释. 1.可以滑动页面到最底端: //设置本地ChromDrive驱动路径,改成你自 ...
- 怎么把apk文件部署在云服务器上
你服务器直接使用nginx,将请求映射到固定目录,把你的apk放到该目录.其他都不用干了.
- logging日志模块_python
一.logging模块 1.功能 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设 ...
- hrtf virtual surround matlab实现
将5.1 ch的数据经过hrtf处理,然后downmix到2ch,使得2ch的数据有virtual surround的效果. function output = hrir_process(input) ...
- svn checkout使用
(1)需要知道三个东西:svn路径和号码和密码. (2)svn导出的地方建立需要的目录,然后在不同目录下svn check out,输入正确的路径和号码和密码,这样就可以正常svn下来目录了.
- 第一篇 网站基础知识 第3章 DNS的设置
第3章 DNS的设置 3.1 DNS解析 3.2 Windows 7设置DNS服务器 3.3Windows设置本机域名和IP的对应关系 在自己的电脑里也可以设置域名和IP的对应关系,具体设置是在C:\ ...
- 一次 utf-8 bom引起的问题
同事代码新增加了功能,推到服务器上,意外导致登录失败,回退到之前的版本上,可以正常使用. 这次只上传了 route.php 文件,系统登录失败. 随后使用kdiff3对比了两版本的route.php文 ...
- python3练习100题——027
又是一道迭代的题,没做好. 看了答案才试着写出来. 我一定要加油啊,为了尽快摆脱现在讨厌的生活! 原题链接:http://www.runoob.com/python/python-exercise-e ...