首页 > 其他分享 >注解给指定属性开启反射accessible

注解给指定属性开启反射accessible

时间:2024-08-15 17:38:22浏览次数:12  
标签:accessible lang set ReflectiveFieldAccess 开启 import 注解 annotation

要实现在属性上使用注解,并通过AOP给该属性的set方法设置setAccessible(true),可以通过以下步骤进行:

  1. 定义注解:首先定义一个注解,用于标记需要通过反射访问的属性。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReflectiveFieldAccess {
}
  1. 创建切面:创建一个切面,拦截所有含有@ReflectiveFieldAccess注解的类的构造函数。在构造函数执行后,遍历类中所有字段,对于每个带有@ReflectiveFieldAccess注解的字段,找到其对应的set方法并设置setAccessible(true)
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

@Aspect
@Component
public class ReflectiveFieldAccessAspect {

    @Pointcut("execution(*.new(..)) && @within(org.springframework.stereotype.Component)")
    public void componentClassConstructor() {}

    @After("componentClassConstructor()")
    public void afterConstructor() throws Exception {
        // 获取目标对象
        Object targetObject = // 获取构造函数创建的对象实例,这里需要根据实际情况获取
        Class<?> targetClass = targetObject.getClass();
        Field[] fields = targetClass.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(ReflectiveFieldAccess.class)) {
                String setterName = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
                try {
                    Method setterMethod = targetClass.getDeclaredMethod(setterName, field.getType());
                    setterMethod.setAccessible(true);
                } catch (NoSuchMethodException e) {
                    // 处理异常,例如没有找到对应的set方法
                }
            }
        }
    }
}
  1. 使用注解:在需要通过反射访问的属性上使用@ReflectiveFieldAccess注解。
import org.springframework.stereotype.Component;

@Component
public class SomeClass {

    @ReflectiveFieldAccess
    private String someField;

    public void setSomeField(String someField) {
        this.someField = someField;
    }
}

这个示例中,我们定义了一个切面ReflectiveFieldAccessAspect,它在Spring组件的构造函数执行后,检查该组件中所有字段。对于每个带有@ReflectiveFieldAccess注解的字段,找到其对应的set方法并设置setAccessible(true),以便可以通过反射访问这些私有字段的set方法。

需要注意的是,这个示例中的afterConstructor方法中的Object targetObject = // 获取构造函数创建的对象实例部分是伪代码,实际实现时需要根据具体情况来获取目标对象的实例。这可能需要使用AspectJ的thisJoinPoint或其他机制来获取。此外,这个方法假设所有带有@ReflectiveFieldAccess注解的字段都有标准的set方法,如果没有,将会抛出NoSuchMethodException异常。

标签:accessible,lang,set,ReflectiveFieldAccess,开启,import,注解,annotation
From: https://www.cnblogs.com/qianingmeng/p/18361455

相关文章

  • 禁止使用 @NotEmpty 注解
    先上结论:@NotEmpty是一个容易让人产生误解的注解,因为他不是一个原子注解;@NotEmpty注解作用于string的话,很鸡肋,没有@NotBlank更简单暴力,容易理解;避免出现空格的问题;空格也没有什么具体业务场景;@NotEmpty作用于list的话也是很鸡肋,不如:@NotNull+@Size灵活容易理解;**......
  • 深入解析Spring Boot中的@ConfigurationProperties注解
    深入解析SpringBoot中的@ConfigurationProperties注解在SpringBoot框架中,配置管理是一个核心功能。SpringBoot提供了多种方式来处理外部配置,其中@ConfigurationProperties注解是一个非常强大且灵活的工具。本文将深入探讨@ConfigurationProperties注解的概念、用法、工......
  • 时空大数据:编织地球智慧网络,开启未来决策新篇章
    在地理信息与遥感科学的浩瀚宇宙里,“时空大数据平台”不仅仅是数据的海洋,它是洞察过去、感知现在、预见未来的智慧之眼。本文将深入剖析时空大数据平台的核心价值、技术挑战与未来展望,为您揭开这一时代洪流中的智慧密码。时空大数据:地理信息的时空织锦时空大数据......
  • Flowable在开启工作流是设置各节点审批人
    该方式用于流程固定并且明确知道每个节点什么人审批。步骤一:指定参数,比如某个节点设置的审批人为${AAAAA}如图:步骤二:在工作流启动前向启动工作流时使用的startProcessInstanceByKeyAndTenantId()方法中填充variables参数,variables中是键值对的形式,其中AAAAA这个参数需要给值......
  • [Python] 通过pymongo连接docker中并开启了副本集的mongodb数据库
    需要指定directConnection=true&authSource=atp-test参数,,否则会报连接副本集超时。在PyMongo中,directConnection参数可以决定客户端是否直接连接到MongoDB服务器,而不是自动发现所有的副本集成员。当directConnection设置为true时,客户端将只连接到MongoDB连接字符......
  • 数据库表对应的实体类上的相关注解
    一、解释这些注解是Java中常用的Lombok库和MyBatis-Plus框架提供的,用于简化实体类的开发和ORM映射。下面是对每个注解的解释:1.**@Data**:  -这是Lombok库的一个综合注解,包含了以下几个注解的功能:   -`@Getter`:为所有字段生成getter方法。   -`@Setter`:......
  • ollama的set parameter的参数的注解
    >>>/setparameterAvailableParameters:/setparameterseed<int>Randomnumberseed/setparameternum_predict<int>Maxnumberoftokenstopredict/setparametertop_k<int>Pickfromtopk......
  • 洛谷P2758编辑距离超详注解
    注:本蒟蒻第一篇题解本文亦发表于洛谷博客题目跳转题目大意用最少的字符操作次数,将字符串A转换为字符串B。字符操作为:1.删除一个字符;2.插入一个字符;3.将一个字符改为另一个字符。代码思路本题很明显用的是DP1.赋值将dp数组的值赋值到最大2.特殊赋值对......
  • Arena Breakout Infinite不限号开启
    官网:https://www.arenabreakoutinfinite.com/zh-Hant/  ......
  • @DateTimeFormat 和 @JsonFormat 注解详解
    目录一、快速入门1.1准备工作1.2、入参格式化(前端传参到后端)1.3、出参格式化(后端返回给前端)1.4、如果是请求体@RequestBody传参二、详细解释这两个注解1、@JsonFormat2、@DateTimeFormat注意:1、这两者的注解一般联合使用2、注意2参考链接一、快速入门先说总结:如果......