09.注解Plus

1.运行时注解及反射配合

2.没有标题,好好看

Class.getMethods() //仅获取本类所有公共方法(含继承)
Class.getDeclaredMethods() //获取本类所有方法(含私有、保护、公共,但不会继承)

以上返回的是本类中的所有方法对象数组。将Method换成Field,返回的是本类中的所有字段对象数组。

3.反射得注解

  getAnnotations() //返回Annotation数组,是某个类/方法/字段/参数上的所有注解实例,该实例使用时需要进行强转
  isAnnotationPresent(指定的注解.class) 
  getAnnotation(指定的注解.class)

上述方法由Class、Method、Field、 Parameter 每一个调用,分别得到类/方法/字段/参数上的所有注解实例。

4.类的结构(即类的组成)

  • Class

  • Method

    • getName() 得到方法名

    • getParameters() 返回Parameter[],每个Parameter对象包含:

      • 参数的类型、参数的名称、是否为可变参数、是否为隐式参数
    • getParameterAnnotations 返回的是Annotation[][]

    • Field

      • set(bean, value)、get(bean)

5.使用注解给方法的参数传值

Object[] finalParams = generateFinalParams(parameters, manualParams);//先生成最终参数,manualParams不用注解传参
public static Object[] generateFinalParams(Parameter[] parameters, Object[] manualParams) {
    List<Object> findParams = new ArrayList<>();
    int manualParamsCount = 0;
    for (Parameter param : parameters) {
        Object paramValue = null;
        customAnno = param.getAnnotation(注解名);
        if (customAnno != null) { // 提取注解类的value值 } 
        else 
          { 
            paramValue = manualParam[manualParamsCount++] 
        }
    }
}

反射解析注解并注入配置值

public static void invokeWithConfig(Object target, String methodName, Object... manualParams) {
    Class<?> clazz = target.getClass();
    Method method = findMethodByName(clazz, methodName);
    ...
    method.invoke(target, finalParams);
}

findMethodByName(Class<?> clazz, String methodName) {
    for (Method method : clazz.getDeclaredMethods()) {
        if (method.getName().equals(methodName)) {
            return method;
        }
    }
    return null;
}

6.具体理解
  假如我要执行 save 方法:save (@custom("小白") String name, int age, String desc),则传入save所在的类实例,以及按顺序传入没有注解的参数值,invokeWithConfig(service, "save", 18, "小白真好看")

posted @ 2025-12-02 22:37  那就改变世界吧  阅读(0)  评论(0)    收藏  举报