这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~

一、准备自定义注解

  注:如何实现自定义注解,请移步百度。

二、实现

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动态代理+反射实现动态修改注解属性值的更多相关文章

  1. Java反射之Bean修改更新属性值等工具类

    package com.bocean.util; import java.lang.annotation.Annotation; import java.lang.reflect.Field; imp ...

  2. 杨晓峰-Java核心技术-6 动态代理 反射 MD

    目录 第6讲 | 动态代理是基于什么原理? 典型回答 考点分析 知识扩展 反射机制及其演进 动态代理 精选留言 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAnd ...

  3. 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式

    从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...

  4. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  5. 代理模式详解:静态代理、JDK动态代理与Cglib动态代理

    代理模式简介分类 概念 ​ 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. ​ 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...

  6. JDK 动态代理与 CGLIB 动态代理,它俩真的不一样

    摘要:一文带你搞懂JDK 动态代理与 CGLIB 动态代理 本文分享自华为云社区<一文带你搞懂JDK 动态代理与 CGLIB 动态代理>,作者: Code皮皮虾 . 两者有何区别 1.Jd ...

  7. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  8. jdk动态代理与cglib动态代理例子

    1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...

  9. Java代理(静态代理、JDK动态代理、CGLIB动态代理)

    Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...

随机推荐

  1. 腾讯云COS对象存储

    一.腾讯云COS 腾讯云对象存储 COS 是一种存储海量数据的分布式存储服务.COS 提供了多种对象的存储类型:标准存储.低频存储.归档存储. 二.为什么要使用TA 便宜: 个人用户有6个月的免费使用 ...

  2. asp.net mvc获取http body中的json

    今天遇到一个对方直接post 一共json对象字符串过来的场景.按照以前的旧方案方法可以直接在request.inputstream里面读取,然后反序列化即可.(当然估计ASP.NET MVC应该有更 ...

  3. Go生成随机数

    生成随机数 概念 伪随机数,都是根据一定的算法公式算出来的. 所在包 math/rand 生成随机数的公式需要一个种子数,一般为整数.种子数相同会导致每次启动程序是生成随机数相同,为了避免重复每次生成 ...

  4. shell编程基础知识

    什么是shell shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户 shell对话方式 交互的方 ...

  5. C语言注释符号

    同学们认为注释很简单,那我来看看下面的代码是否正确? 1.似是而非的问题 int main() { int/*...*/i; char* s = "abcdefgh //hijklmn&qu ...

  6. AM335X的SD卡更新系统学习记录

    一般利用一张SD卡就能进行系统的更新,以前一直不知是什么原理,最近了解了下,对了解到的内容做个记录.使用的是AM335X平台,系统是Linux,文件系统是EXT3: 1.首先需要一张分好分区的SD卡( ...

  7. codeforces 1283E New Year Parties (贪心)

    链接:https://codeforces.com/contest/1283/problem/E 题意: 有n个人住在一些房子里,有的人住在同一个房子里.每个人可以选择搬去他的房子左边那个房子或者右边 ...

  8. 刷题75. Sort Colors

    一.题目说明 题目75. Sort Colors,给定n个整数的列表(0代表red,1代表white,2代表blue),排序实现相同颜色在一起.难度是Medium. 二.我的解答 这个是一个排序,还是 ...

  9. C语言数据结构——第四章 串

    四.串 4.1-串的基本概念 串的定义 串是由数字.字母或其他字符组成的有限序列,一般记为 StringName = “a[0]a[1]a[2]···a[i]···a[n-1]”(n>0,0&l ...

  10. 三剑客-sed awk

     目录 1.sed 2.awk 1.sed //sed命令 #语法说明:命令 参数 条件+处理= (指令) 处理文件信息 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作 ). 擅长对行进 ...