java.lang.reflect.Parameter类提供了用于获取和操作构造器的静态方法。

1.通过Parameter可以做什么

通过Parameter可以做以下事情:

  • 如何通过Class对象获取其方法或构造器的参数Parameter对象?
  • 如何通过Parameter获取相关信息:参数名、修饰符、参数类型、参数化类型、可变参数、注解

2.代码实例

实体类:

/**
 * <p>用户表</p>
 *
 * @author hanchao 2018/2/14 22:30
 */
public class User{
    public String username = "张三";
    private int password = 123456;

    /**
     * <p>测试:java反射-参数Parameter</p>
     *
     * @author hanchao 2018/3/4 14:24
     **/
    public void initUser(@MyAnnotationA @MyAnnotationB String username, @MyAnnotationB String password) {
    }
}

实例类:

/**
 * Created by 韩超 on 2018/3/1.
 */
public class ReflectParameterDemo {
    private final static Logger LOGGER = Logger.getLogger(ReflectParameterDemo.class);

    /**
     * <p>Title: java反射-参数Parameter</p>
     *
     * @author 韩超 2018/3/1 15:56
     */
    public static void main(String[] args) throws NoSuchMethodException {
        //===================================== 通过Class对象获取Parameter对象 =====================================
        LOGGER.info("===================================== 通过Class对象获取Parameter对象 =====================================");
        //首先获取Class对象
        Class userClass = User.class;
        LOGGER.info("首先获取Class对象:" + userClass);
        //然后获取Method(或者Constructor)对象
        Method method = userClass.getDeclaredMethod("initUser", String.class, String.class);
        LOGGER.info("然后获取Method或者Constructor对象:" + method);
        //然后获取Parameter对象数组
        Parameter[] parameters = method.getParameters();
        LOGGER.info("然后通过getParameters()获取Parameter对象数组");
        //然后获取Parameter对象
        Parameter parameter = parameters[0];
        LOGGER.info("最终获得参数Parameter对象" + parameter + "\n");

        //===================================== Parameter信息获取 =====================================
        LOGGER.info("===================================== Parameter信息获取 =====================================");
        LOGGER.info("通过parameter.getModifiers()获取参数修饰符:" + Modifier.toString(parameter.getModifiers()));
        LOGGER.info("通过parameter.getName()获取参数名:" + parameter.getName());
        LOGGER.info("通过parameter.getParameterizedType()获取参数化类型(泛型):" + parameter.getParameterizedType());
        LOGGER.info("通过parameter.toString()获取参数的字符串描述:" + parameter.toString());
        LOGGER.info("通过parameter.isSynthetic()判断参数是否是合成的:" + parameter.isSynthetic());
        LOGGER.info("通过parameter.isImplicit()判断参数是否是隐式的:" + parameter.isImplicit());
        LOGGER.info("通过parameter.isNamePresent()判断参数是否以类文件名命名:" + parameter.isNamePresent());
        LOGGER.info("通过parameter.isVarArgs()判断参数是否是可变的:" + parameter.isVarArgs() + "\n");

        //===================================== Parameter注解信息 =====================================
        LOGGER.info("===================================== Parameter注解信息 =====================================");
        //通过parameter.getAnnotatedType()获取注解的类型(组合类型)
        AnnotatedType annotatedType = parameter.getAnnotatedType();
        LOGGER.info("通过parameter.getAnnotatedType()获取注解的类型(组合类型)--参数类型:" + annotatedType.getType() + "\n");

        //通过parameter.getAnnotation()和parameter.getDeclaredAnnotation()获取参数的一个注解
        LOGGER.info("通过parameter.getAnnotation()获取参数的一个注解:" + parameter.getAnnotation(MyAnnotationB.class));
        LOGGER.info("通过parameter.getDeclaredAnnotation()获取参数的一个注解:" + parameter.getDeclaredAnnotation(MyAnnotationB.class) + "\n");

        //通过parameter.getAnnotationsByType(annotation.class)获取一类注解
        Annotation[] typeAnnotations = parameter.getAnnotationsByType(MyAnnotationB.class);
        for (Annotation annotation : typeAnnotations) {
            LOGGER.info("通过parameter.getAnnotationsByType(annotation.class)获取一类注解:" + annotation);
        }
        //通过parameter.getDeclaredAnnotationsByType(annotation.class)获取一类注解
        Annotation[] typeAnnotations1 = parameter.getDeclaredAnnotationsByType(MyAnnotationB.class);
        for (Annotation annotation : typeAnnotations1) {
            LOGGER.info("通过parameter.getDeclaredAnnotationsByType(annotation.class)获取一类注解:" + annotation);
        }
        System.out.println("");

        //通过parameter.getAnnotations()获取全部注解
        Annotation[] annotations = parameter.getAnnotations();
        for (Annotation annotation : annotations) {
            LOGGER.info("通过parameter.getAnnotations()获取全部注解:" + annotation);
        }
        //通过parameter.getDeclaredAnnotations()获取全部注解
        Annotation[] annotations1 = parameter.getDeclaredAnnotations();
        for (Annotation annotation : annotations1) {
            LOGGER.info("通过parameter.getDeclaredAnnotations()获取全部注解:" + annotation);
        }
    }
}

3.运行结果

2018-03-04 14:46:45 INFO  ReflectParameterDemo:26 - ===================================== 通过Class对象获取Parameter对象 =====================================
2018-03-04 14:46:45 INFO  ReflectParameterDemo:29 - 首先获取Class对象:class pers.hanchao.reflect.common.User
2018-03-04 14:46:45 INFO  ReflectParameterDemo:32 - 然后获取Method或者Constructor对象:public void pers.hanchao.reflect.common.User.initUser(java.lang.String,java.lang.String)
2018-03-04 14:46:45 INFO  ReflectParameterDemo:35 - 然后通过getParameters()获取Parameter对象数组
2018-03-04 14:46:45 INFO  ReflectParameterDemo:38 - 最终获得参数Parameter对象java.lang.String arg0

2018-03-04 14:46:45 INFO  ReflectParameterDemo:41 - ===================================== Parameter信息获取 =====================================
2018-03-04 14:46:45 INFO  ReflectParameterDemo:42 - 通过parameter.getModifiers()获取参数修饰符:
2018-03-04 14:46:45 INFO  ReflectParameterDemo:43 - 通过parameter.getName()获取参数名:arg0
2018-03-04 14:46:45 INFO  ReflectParameterDemo:44 - 通过parameter.getParameterizedType()获取参数化类型(泛型):class java.lang.String
2018-03-04 14:46:45 INFO  ReflectParameterDemo:45 - 通过parameter.toString()获取参数的字符串描述:java.lang.String arg0
2018-03-04 14:46:45 INFO  ReflectParameterDemo:46 - 通过parameter.isSynthetic()判断参数是否是合成的:false
2018-03-04 14:46:45 INFO  ReflectParameterDemo:47 - 通过parameter.isImplicit()判断参数是否是隐式的:false
2018-03-04 14:46:45 INFO  ReflectParameterDemo:48 - 通过parameter.isNamePresent()判断参数是否以类文件名命名:false
2018-03-04 14:46:45 INFO  ReflectParameterDemo:49 - 通过parameter.isVarArgs()判断参数是否是可变的:false

2018-03-04 14:46:45 INFO  ReflectParameterDemo:52 - ===================================== Parameter注解信息 =====================================
2018-03-04 14:46:45 INFO  ReflectParameterDemo:55 - 通过parameter.getAnnotatedType()获取注解的类型(组合类型)--参数类型:class java.lang.String

2018-03-04 14:46:45 INFO  ReflectParameterDemo:58 - 通过parameter.getAnnotation()获取参数的一个注解:@pers.hanchao.reflect.common.MyAnnotationB()
2018-03-04 14:46:45 INFO  ReflectParameterDemo:59 - 通过parameter.getDeclaredAnnotation()获取参数的一个注解:@pers.hanchao.reflect.common.MyAnnotationB()

2018-03-04 14:46:45 INFO  ReflectParameterDemo:64 - 通过parameter.getAnnotationsByType(annotation.class)获取一类注解:@pers.hanchao.reflect.common.MyAnnotationB()
2018-03-04 14:46:45 INFO  ReflectParameterDemo:69 - 通过parameter.getDeclaredAnnotationsByType(annotation.class)获取一类注解:@pers.hanchao.reflect.common.MyAnnotationB()

2018-03-04 14:46:45 INFO  ReflectParameterDemo:76 - 通过parameter.getAnnotations()获取全部注解:@pers.hanchao.reflect.common.MyAnnotationA()
2018-03-04 14:46:45 INFO  ReflectParameterDemo:76 - 通过parameter.getAnnotations()获取全部注解:@pers.hanchao.reflect.common.MyAnnotationB()
2018-03-04 14:46:45 INFO  ReflectParameterDemo:81 - 通过parameter.getDeclaredAnnotations()获取全部注解:@pers.hanchao.reflect.common.MyAnnotationA()
2018-03-04 14:46:45 INFO  ReflectParameterDemo:81 - 通过parameter.getDeclaredAnnotations()获取全部注解:@pers.hanchao.reflect.common.MyAnnotationB()

4.总结

根据代码实例和运行结果,总结如下:

  • 通过Class对象获取Parameter对象
  1. 首先获取Class对象
  2. 然后获取Method(或者Constructor)对象
  3. 然后通过getParameters()获取Parameter对象数组
  4. 最终获得参数Parameter对象
  • Parameter信息获取
  1. 通过parameter.getModifiers()获取参数修饰符
  2. 通过parameter.getName()获取参数名
  3. 通过parameter.getParameterizedType()获取参数化类型(泛型)
  4. 通过parameter.toString()获取参数的字符串描述
  5. 通过parameter.isSynthetic()判断参数是否是合成的
  6. 通过parameter.isImplicit()判断参数是否是隐式的
  7. 通过parameter.isNamePresent()判断参数是否以类文件名命名
  8. 通过parameter.isVarArgs()判断参数是否是可变的
  9. 通过parameter.getAnnotatedType()获取注解的类型(组合类型)
  10. 通过parameter.getAnnotation()和parameter.getDeclaredAnnotation()获取参数的一个注解
  11. 通过parameter.getAnnotationsByType(annotation.class)和parameter.getDeclaredAnnotationsByType(annotation.class)获取一类注解
  12. 通过parameter.getAnnotations()和parameter.getDeclaredAnnotations()获取全部注解