Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法
java.lang.Class类提供了获取类的各种信息对象的静态方法。
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79363921
1.通过Class类可以做什么
- 获取类的包(Package)信息
- 获取类的注解(Annotation)信息
- 获取类的修饰符(Modifier)信息
- 获取类的继承的父类(Super Class)信息
- 获取类的实现的接口(Interface)信息
- 获取类的类名信息
- 获取类的字段(Field)信息
- 获取类的构造方法(Constructor)信息
- 获取类的方法(Method)信息
2.实例代码
User类
1 /** 2 * <p>用户表</p> 3 */ 4 @MyAnnotationA 5 @MyAnnotationB 6 public class User extends SuperUser implements InterfaceAAA,InterfaceBBB { 7 public String username = "张三"; 8 public int password = 123456; 9 //setter getter constructor toString ... 10 }
测试类:
1 /** 2 * <p>java.lang.Class示例</p> 3 **/ 4 public class ReflectClassesDemo { 5 private static final Logger LOGGER = Logger.getLogger(ReflectClassesDemo.class); 6 7 /** 8 * <p>Java反射-类Class示例</p> 9 **/ 10 public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 11 //获得Class对象 12 Class userClass = User.class; 13 14 //获得包信息 Package 15 LOGGER.info("通过class.getPackage()获得类的包名:" + userClass.getPackage()); 16 17 //获取注解信息 18 LOGGER.info("通过class.getDeclaredAnnotation(name)获取指定的注解:" + userClass.getDeclaredAnnotation(MyAnnotationB.class)); 19 Annotation[] annotations = userClass.getDeclaredAnnotations(); 20 for (Annotation annotation : annotations) { 21 LOGGER.info("通过class.getDeclaredAnnotations()获取全部的注解:" + annotation); 22 } 23 24 //获取修饰符 Modifier 25 LOGGER.info("通过class.getModifiers()获得类的修饰符:" + Modifier.toString(userClass.getModifiers())); 26 27 //获的继承的父类 SuperClass 28 LOGGER.info("通过class.getSuperclass()获得类的父类" + userClass.getSuperclass()); 29 30 //获取类实现的接口 Interface 31 Class[] interfaces = userClass.getInterfaces(); 32 for (Class inter : interfaces) { 33 LOGGER.info("通过class.getInterfaces()获取类实现的接口:" + inter); 34 } 35 36 //获取类的名称 37 LOGGER.info("通过class.getName()获得类的全名:" + userClass.getName()); 38 LOGGER.info("通过class.getSimpleName()获得类的简名:" + userClass.getSimpleName()); 39 40 //获取字段 Field 41 LOGGER.info("通过class.getDeclaredField(name)获取指定的字段:" + userClass.getDeclaredField("username")); 42 Field[] fields = userClass.getDeclaredFields(); 43 for (Field field : fields) { 44 LOGGER.info("通过class.getDeclaredFields()获取全部字段:" + field); 45 } 46 47 //获取构造器 Constructor 48 LOGGER.info("通过class.getDeclaredConstructor(args...)获取指定的构造器:" + userClass.getDeclaredConstructor()); 49 Constructor[] constructors = userClass.getDeclaredConstructors(); 50 for (Constructor constructor : constructors) { 51 LOGGER.info("通过class.getDeclaredConstructors()获取全部构造器:"); 52 } 53 User user = (User) userClass.getDeclaredConstructor().newInstance(); 54 LOGGER.info("通过constructor.newInstance(args...)进行对象实例化:" + user.toString()); 55 56 //获取方法 Method 57 LOGGER.info("通过class.getDeclaredMethod(args...)获取指定的方法:" + userClass.getDeclaredMethod("setPassword", int.class)); 58 Method[] methods = userClass.getDeclaredMethods(); 59 for (Method method : methods) { 60 LOGGER.info("通过class.getDeclaredMethods()获取全部的方法:" + method); 61 } 62 userClass.getDeclaredMethod("setPassword", int.class).invoke(user, 9999); 63 LOGGER.info("通过method.invoke(obj,args...)执行方法:" + user.toString()); 64 } 65 }
3.运行结果
1 INFO ReflectClassesDemo:28 - 通过class.getPackage()获得类的包名:package pers.hanchao.reflect.common 2 INFO ReflectClassesDemo:31 - 通过class.getDeclaredAnnotation(name)获取指定的注解:@pers.hanchao.reflect.common.MyAnnotationB() 3 INFO ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationA() 4 INFO ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationB() 5 INFO ReflectClassesDemo:38 - 通过class.getModifiers()获得类的修饰符:public 6 INFO ReflectClassesDemo:41 - 通过class.getSuperclass()获得类的父类class pers.hanchao.reflect.common.SuperUser 7 INFO ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceAAA 8 INFO ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceBBB 9 INFO ReflectClassesDemo:50 - 通过class.getName()获得类的全名:pers.hanchao.reflect.common.User 10 INFO ReflectClassesDemo:51 - 通过class.getSimpleName()获得类的简名:User 11 INFO ReflectClassesDemo:54 - 通过class.getDeclaredField(name)获取指定的字段:public java.lang.String pers.hanchao.reflect.common.User.username 12 INFO ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public java.lang.String pers.hanchao.reflect.common.User.username 13 INFO ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public int pers.hanchao.reflect.common.User.password 14 INFO ReflectClassesDemo:61 - 通过class.getDeclaredConstructor(args...)获取指定的构造器:public pers.hanchao.reflect.common.User() 15 INFO ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器: 16 INFO ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器: 17 INFO ReflectClassesDemo:67 - 通过constructor.newInstance(args...)进行对象实例化:User{username='张三', password='123456'} 18 INFO ReflectClassesDemo:70 - 通过class.getDeclaredMethod(args...)获取指定的方法:public void pers.hanchao.reflect.common.User.setPassword(int) 19 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.main(java.lang.String[]) 20 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.toString() 21 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.test(java.lang.Object) 22 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setPassword(int) 23 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public int pers.hanchao.reflect.common.User.getPassword() 24 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setUsername(java.lang.String) 25 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.getUsername() throws java.lang.NullPointerException,java.lang.ArrayStoreException 26 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.initUser(java.lang.String,java.lang.String) 27 INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.demo(java.lang.String[]) 28 INFO ReflectClassesDemo:76 - 通过method.invoke(obj,args...)执行方法:User{username='张三', password='9999'}
4.总结
- 通过class.getPackage()获取类的包(Package)信息
- 通过class.getDeclaredAnnotation(name)获取类的注解(Annotation)信息
- 通过class.getModifiers()获取类的修饰符(Modifier)信息
- 通过class.getSuperclass()获取类的继承的父类(Super **Class)信息
- 通过class.getInterfaces()获取类的实现的接口(Interface)信息
- 通过class.getName()获取类的类名信息
- 通过class.getDeclaredField(name)获取类的字段(Field)信息
- 通过class.getDeclaredConstructor(args…)获取类的构造方法(Constructor)信息
- 通过class.getDeclaredMethod(args…)获取类的方法(Method)信息
其中,关于注解(Annotation)、修饰符(Modifier)、字段(Field)、构造器(Constructor)和方法(Method)的相关内容,在后续章节中会继续深入学习。
- 上一篇 »java之反射和BeanUtils类
- 下一篇 »JAVA-使用反射创建class的实例对象