反射类 Method类的使用

反射类 Method类的使用

   在Java反射中,可以使用Method类获取类,参数类型,方法注解,参数注解,方法返回值等信息,在使用Method类中,常会用到以下的方法。如下表所示。

 
方法名  作用

getName()

 获取方法名
isVarArgs()  如果该方法声明为采用可变数量的参数,则返回true; 否则返回false
getModifiers()  获取权限修饰符
getReturnType()  获取返回类型
getExceptionTypes()  获取所有抛出的异常类型
getGenericReturnType  返回Type类型
getParameterTypes()  获取所有参数的类型
getParameterCount()  获取所有参数的个数
getAnnotations() 获取方法级别的注解
getDeclaringClass  获取方法所在的类信息

  

  使用如下的示例说明Method类的使用,下面代码段定义了两个参数级别的注解,在MethodService类中给定了一个login()方法,三个入参,其中两个参数使用注解进行标注。观察main()方法的结果。

 1 package com.zzz.mybatis.reflect;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 @Documented
10 @Retention(RetentionPolicy.RUNTIME)
11 @Target(ElementType.PARAMETER)
12 public @interface Name {
13     //默认为空
14     String name() default  "lisi";
15 }

 

 1 package com.zzz.mybatis.reflect;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 @Retention(RetentionPolicy.RUNTIME)
 8 @Target(ElementType.PARAMETER)
 9 public @interface Password {
10     //默认为空
11     String password() default  "";
12 }
 1 package com.zzz.mybatis.reflect;
 2 
 3 import java.lang.annotation.Annotation;
 4 import java.lang.reflect.AnnotatedType;
 5 import java.lang.reflect.Method;
 6 import java.lang.reflect.Parameter;
 7 
 8 public class MethodService {
 9     @Deprecated
10     public void login(@Name(name="zhangsan") String name,@Password(password="123") String pwd,int age) throws NullPointerException,IllegalArgumentException {
11 
12     }
13 
14     public static void getAnnotations(Method method) {
15         String name="",pwd="";
16         Annotation[][] ans=method.getParameterAnnotations();
17         int anslen=ans.length;
18          for (int paramIndex = 0; paramIndex < anslen; paramIndex++) {
19               for (Annotation annotation : ans[paramIndex]) {
20                   //判断是否是Param标签的子类,也就是说@param中是否存在value值
21                 if (annotation instanceof Name) {
22                   name = ((Name) annotation).name();
23                   break;
24                 }
25                 if (annotation instanceof Password) {
26                     pwd=((Password)annotation).password();
27                     break;
28                 }
29               }
30          }
31          System.out.println("name"+name+"\t"+"pwd"+pwd);
32     }
33 
34     public static void getActualParameter(Method method) {
35         System.out.println("获取参数个数"+method.getParameterCount());
36         Class<?>[] parameterTypes= method.getParameterTypes();
37         System.out.println("获取所有参数类型");
38         for(Class<?> type:parameterTypes) {
39             System.out.println(type.getName());
40         }
41         System.out.println("获取所有注解");
42         AnnotatedType[] ans=method.getAnnotatedParameterTypes();
43         for(AnnotatedType annotation:ans) {
44             System.out.println(annotation.getClass().getName());
45         }
46         System.out.println("获取完整参数信息");
47       Parameter[] parameters=method.getParameters();
48       for(Parameter parameter:parameters) {
49           System.out.println("参数修饰符:"+parameter.getModifiers()+"参数名:"+parameter.getName()+"参数类型:"+parameter.getType().getName());
50       }
51     }
52 
53 
54     public static void getException(Method method) {
55          Class<?>[] exs=method.getExceptionTypes();
56          for(Class<?> e:exs) {
57              System.out.println(e.getName());
58          }
59     }
60 
61     public static void getMethodAnotation(Method method) {
62         Annotation[] annotations=method.getAnnotations();
63         for(Annotation annotation:annotations) {
64             System.out.println(annotation.annotationType().getName());
65         }
66 
67     }
68 
69     public static void main(String[] args) throws ClassNotFoundException {
70         Class<?> c=Class.forName("com.zzz.mybatis.reflect.MethodService");
71         Method[] methods= c.getMethods();
72         for(Method method:methods) {
73             Class<?>[] paramTypes=method.getParameterTypes();
74             //获取方法名
75             if(method.getName().contains("login")) {
76                 //获取方法所在的类 com.zzz.mybatis.reflect.MethodService
77                 System.out.println("方法所在的类信息:"+method.getDeclaringClass().getName());
78                 //获取方法返回的类型
79                 System.out.println("返回类型:"+method.getReturnType().getName());
80                 //跟getReturnType()类型,不过返回的是一个Type类型
81                 System.out.println("返回Type类型:"+method.getGenericReturnType().getTypeName());
82                 //参数相关
83                 getActualParameter(method);
84                 //获取参数级别的注解信息
85                 getAnnotations(method);
86                 //获取抛出的异常信息
87                 getException(method);
88                 //获取方法级别的注解信息
89                 getMethodAnotation(method);
90         }
91     }
92 
93 }
94 }

 

 1 方法所在的类信息:com.zzz.mybatis.reflect.MethodService
 2 返回类型:void
 3 返回Type类型:void
 4 获取参数个数3
 5 获取所有参数类型
 6 java.lang.String
 7 java.lang.String
 8 int
 9 获取所有注解
10 sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl
11 sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl
12 sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl
13 获取完整参数信息
14 参数修饰符:0参数名:arg0参数类型:java.lang.String
15 参数修饰符:0参数名:arg1参数类型:java.lang.String
16 参数修饰符:0参数名:arg2参数类型:int
17 namezhangsan    pwd123
18 java.lang.NullPointerException
19 java.lang.IllegalArgumentException
20 java.lang.Deprecated

 

posted @ 2019-07-20 23:52  爱吃猫的鱼z  阅读(2777)  评论(0编辑  收藏  举报