自定义注解,根据反射拿到被注解修饰的类,方法,属性

自定义注解,根据反射拿到被注解修饰的类,方法,属性

自定义注解

//作用在类,类的成员变量上 ElementType.TYPE该注解作用于类
//ElementType.FIELD 该注解作用于类的属性
//ElementType.METHOD 该注解作用于方法
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
//生命周期 
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnotNote {

    String value() default "0";
    int age() default 0;

}

在方法上加上

@Bean
@AnnotNote
public Student anStu(){
        return new Student("张",12,"男");
}

在属性上加上

package com.lqy.redis.bean;

/**
 * @title: DataBean
 * @Author Tan
 * @Date: 2020/8/5 11:55
 * @Version 1.0
 */
/**
 * C
 * FileName: DataBean
 * Author:  
 * Date:     2020/6/17 16:02
 * Description:
 * History:
 * <author>       <version>         <desc>
 * zhaoyi         1.0               描述
 */

import lombok.Data;
import lombok.ToString;

/**
 * 〈功能简述〉<br>
 * 〈数据实体〉
 *
 * @author 35903
 * @create 2020/6/17
 * @since 1.0
 */
@Data
@ToString
public class DataBean {


    /**
     * 数据值
     */
    @AnnotNote()
    private double dataValue;

    /**
     * 数据值时间
     */
    @AnnotNote()
    private String dataValueTime;

    /**
     * 入库时间
     */
    String insertTime;
    /**
     * 相应的数据点号
     */
    private String dataId;
    /**
     * 时间间隔(5分钟,15分钟...)
     */
    private int dataInterval;


}

测试


@Autowired
    PublicReflectionUtils publicReflectionUtils;
@Autowired
ApplicationContext ac;

 ApplicationContext applicationContext = SpringApplicationContextUtil.getApplicationContext();
        String[] beanNamesForType = ac.getBeanNamesForType(Student.class);

        Class<DruidConfig> druidConfigClass = DruidConfig.class;
        Method[] methods = druidConfigClass.getMethods();

//拿到被注解修饰的方法Bean
        for (Method name:methods
             ) {
            if(name.isAnnotationPresent(AnnotNote.class)){
                String name1 = name.getName();
                Object b = ac.getBean(name1);
                System.out.println("拿到Bean"+b);
                System.out.println("被修饰的方法"+name1);
            }
        }
        //模拟传入的对象
        DataBean dataBean = new DataBean();
        dataBean.setDataValue(15);
        dataBean.setInsertTime("adsd");
        dataBean.setDataValueTime("sad");
        dataBean.setDataId("454");
        //根据反射拿到这个类
        Class<? extends DataBean> aClass = dataBean.getClass();
        //拿到这个类中所有属性
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field:declaredFields
             ) {
            //判断属性上是否加了AnnotNote这个注解
            if(field.isAnnotationPresent(AnnotNote.class)){
                String s = field.getName().toString();
                //通过反射根据这个属性名,跟类,拿到这个类中这个属性的值
                Object fieldValueByName = publicReflectionUtils.getFieldValueByName(s, dataBean);
                System.out.println(s+"属性的值:"+fieldValueByName);
                //拿到属性上被这个注解修饰的注解值
                AnnotNote annotation = field.getAnnotation(AnnotNote.class);
                System.out.println("annotation:"+annotation.value());
                //属性描述器
                PropertyDescriptor ps = new PropertyDescriptor(field.getName(),aClass);
                // getReadMethod  获得用于读取属性值的方法;   getWriteMethod(),获得用于写入属性值的方法;
                Method readMethod = ps.getReadMethod();
                Object invoke = readMethod.invoke(dataBean);
                System.out.println("读取:"+invoke);
//                Method writeMethod = ps.getWriteMethod();
//                Object aaabbb = writeMethod.invoke(dataBean, 111);
//                System.out.println("写入:"+aaabbb);
//                System.out.println(annotation);
            }

        }

用到的反射工具类

package com.lqy.redis.util;

import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

/**
 * 〈功能简述〉<br>
 * 〈反射工具类〉
 *
 * @author All en
 * @create 2020/5/6
 * @since 1.0
 */
@Component
public class PublicReflectionUtils {

    /**
     * 功能描述:
     * 〈根据输入对象,查找对象的属性。(包含父类属性)〉
     *
     * @param o 对象
     * @return : java.util.List<java.lang.reflect.Field> 对象属性
     * @author : All En
     * date : 2020/5/6 13:43
     */
    public static Field[] listReflectionField(Object o) throws ClassNotFoundException {
        Class clazz = o.getClass();
        Field[] fields = getAllFields(clazz);
        return fields;
    }


    public static Object getGetMethod(Object ob, String name) throws InvocationTargetException, IllegalAccessException {
        Method[] m = ob.getClass().getMethods();
        for (int i = 0; i < m.length; i++) {
            if (("get" + name).toLowerCase(Locale.ENGLISH).equals(m[i].getName().toLowerCase(Locale.ENGLISH))) {
                return m[i].invoke(ob);
            }
        }
        return null;

    }

    /**
     * 功能描述:
     * 〈获取输入对象的属性〉
     *
     * @param clazz 对象
     * @return : java.lang.reflect.Field[] 对象数据
     * @author : All En
     * date : 2020/5/6 13:43
     */
    private static Field[] getAllFields(Class<?> clazz) throws ClassNotFoundException {
        List<Field> fieldList = new ArrayList<>();
        //对象路径容器
        while (clazz != null) {
            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
            clazz = clazz.getSuperclass();
        }
        //获取Field属性是对象属性。
//        fieldList.addAll(listClassForName(fieldList));
        Field[] fields = new Field[fieldList.size()];
        return fieldList.toArray(fields);
    }

    /**
     * 功能描述:
     * 〈判断Field属性,是否存为对象〉
     *
     * @param fieldList Field属性
     * @return : java.util.List<java.lang.String> 对象数据
     * @author : All En
     * date : 2020/5/6 14:12
     */
    private static List<Field> listClassForName(List<Field> fieldList) throws ClassNotFoundException {
        List<Field> comFieldList = new ArrayList<>();
        for (Field var : fieldList) {
            //判断类型是否为对象路径
            if (var.getGenericType().toString().contains("com")) {
                String[] split = var.getGenericType().toString().split(" ");
                if( split.length >2) {
                    Class z = Class.forName(split[1]);
                    while (z != null) {
                        comFieldList.addAll(new ArrayList<>(Arrays.asList(z.getDeclaredFields())));
                        z = z.getSuperclass();
                    }
                }
            }
        }
        return comFieldList;
    }


    /**
     * 功能描述:〈根据属性名获取对象的属性值〉
     *
     * @param fieldName 属性名
     * @param o         对象
     * @return : java.lang.Object 属性值
     * @author : LL
     * date : 2020.03.19 16:29
     */
    public static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(o, new Object[]{});
            return value;
        } catch (Exception e) {
            return null;
        }
    }



    /**
     * 功能描述:
     * 〈循环遍历对象中的属性值,〉
     *
     * @param o              对象
     * @param UnwantedColumn 对象中不需要的列名
     * @return : java.util.List<java.lang.String>
     * @author : All En
     * date : 2020/6/8 10:33
     */
    public static List<String> reflectionFieldResult(Object o, List<String> UnwantedColumn) throws ClassNotFoundException {
        List<String> data = new ArrayList<>();
        Field[] fields = listReflectionField(o);
        for (Field f : fields) {
            List<String> column = UnwantedColumn.stream().filter(v -> v.equals(f.getName())).collect(Collectors.toList());
            if (column.size() == 0) {
                Object value = getFieldValueByName(f.getName(), o);
                if (null == value)
                    data.add("");
                else
                    data.add(String.valueOf(value));
            }
        }
        return data;
    }

    public static void main(String[] args) {
        String a = null;
        System.out.println(String.valueOf(a));
    }
}

用到的读取上下文

package com.lqy.redis.util;

import org.springframework.context.ApplicationContext;

/**
 * 从Spring上下文取出Bean工具类
 *
 * @author ZhuPengWei
 * @date 2018/6/27 18:04
 */
public class SpringApplicationContextUtil {

    private static ApplicationContext applicationContext = null;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        if (SpringApplicationContextUtil.applicationContext == null) {
           SpringApplicationContextUtil.applicationContext = applicationContext;
        }

    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);

    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于Java自定义字典自定义注解反射注入字典到实体的问题。 首先,自定义字典是一种将一些常量或者枚举型的封装在一起的方式。可以让代码更加易读、易维护。比如,我们可以定义一个字典,用来存储一些常量,如: ``` public class GenderDict { public static final Integer MALE = 1; public static final Integer FEMALE = 2; } ``` 接下来,我们可以使用自定义注解来标记需要注入字典的实体属性上。比如,我们可以定义一个注解,如: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Dictionary { String value(); } ``` 在该注解中,我们使用@Retention和@Target注解来指定注解的保留策略和作用范围。同时,我们还可以使用value属性来指定注解,即该属性需要注入的字典的名称。 最后,我们可以使用反射机制,在运行时动态地将字典注入到实体中。具体的实现方式如下: ``` public class DictionaryInjector { public static void injectDictionary(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Dictionary.class)) { Dictionary dict = field.getAnnotation(Dictionary.class); String dictName = dict.value(); String dictValue = getDictValue(dictName); field.setAccessible(true); field.set(obj, dictValue); } } } private static String getDictValue(String dictName) { // 从字典中获取对应的字典 // 这里可以使用反射或者其他方式来实现 return GenderDict.MALE.equals(dictName) ? "男" : "女"; } } ``` 在上述代码中,我们首先使用Class对象获取实体的所有属性,然后通过判断该属性是否被@Dictionary注解标记来确定是否需要注入字典。如果需要注入,则从注解中获取字典的名称,然后通过反射机制将字典注入到实体属性中。 最后,我们可以在代码中使用如下方式来注入字典: ``` public class User { @Dictionary("gender") private String gender; // getters and setters } public class Main { public static void main(String[] args) throws IllegalAccessException { User user = new User(); DictionaryInjector.injectDictionary(user); System.out.println(user.getGender()); // 输出 "男" } } ``` 在上述代码中,我们首先定义了一个User,并在其中使用@Dictionary注解标记了gender属性。然后,在Main中,我们创建了一个User对象,并调用DictionaryInjector的injectDictionary方法来注入字典。最后,我们通过调用User对象的getGender方法来获取注入后的字典。 希望这能够帮助您解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值