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