• 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)的相关内容,在后续章节中会继续深入学习。

  • 相关阅读:
    10.2 处理大集合
    观察者模式——出版者与订阅者
    phonegap(cordova) 自己定义插件代码篇(五)----android ,iOS 集成微信登陆
    另一鲜为人知的单例写法-ThreadLocal
    Spring MVC中Controller如何将数据返回给页面
    IntelliJ IDEA安装主题详细步骤
    oracle导出dmp文件的2种方法
    Oracle导出表(即DMP文件)的两种方法
    Spring MVC 实现文件的上传和下载
    压力测试 JMeter3.3
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11837699.html
Copyright © 2020-2023  润新知