Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法

[超级通道 : Java反射学习系列-绪论]

java.lang.Class类提供了获取类的各种信息对象的静态方法。

1.通过Class类可以做什么

  • 获取类的包(Package)信息
  • 获取类的注解(Annotation)信息
  • 获取类的修饰符(Modifier)信息
  • 获取类的继承的父类(Super Class)信息
  • 获取类的实现的接口(Interface)信息
  • 获取类的类名信息
  • 获取类的字段(Field)信息
  • 获取类的构造方法(Constructor)信息
  • 获取类的方法(Method)信息
2.实例代码

User类

/**
 * <p>用户表</p>
 *
 * @author hanchao 2018/2/14 22:30
 */
@MyAnnotationA
@MyAnnotationB
public class User extends SuperUser implements InterfaceAAA,InterfaceBBB {
    public String username = "张三";
    public int password = 123456;
    //setter getter constructor toString ... 
}

测试类:

/**
 * <p>java.lang.Class示例</p>
 *
 * @author hanchao 2018/3/3 18:45
 **/
public class ReflectClassesDemo {
    private static final Logger LOGGER = Logger.getLogger(ReflectClassesDemo.class);

    /**
     * <p>Java反射-类Class示例</p>
     *
     * @author hanchao 2018/3/3 18:45
     **/
    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获得Class对象
        Class userClass = User.class;

        //获得包信息 Package
        LOGGER.info("通过class.getPackage()获得类的包名:" + userClass.getPackage());

        //获取注解信息
        LOGGER.info("通过class.getDeclaredAnnotation(name)获取指定的注解:" + userClass.getDeclaredAnnotation(MyAnnotationB.class));
        Annotation[] annotations = userClass.getDeclaredAnnotations();
        for (Annotation annotation : annotations) {
            LOGGER.info("通过class.getDeclaredAnnotations()获取全部的注解:" + annotation);
        }

        //获取修饰符 Modifier
        LOGGER.info("通过class.getModifiers()获得类的修饰符:" + Modifier.toString(userClass.getModifiers()));

        //获的继承的父类 SuperClass
        LOGGER.info("通过class.getSuperclass()获得类的父类" + userClass.getSuperclass());

        //获取类实现的接口 Interface
        Class[] interfaces = userClass.getInterfaces();
        for (Class inter : interfaces) {
            LOGGER.info("通过class.getInterfaces()获取类实现的接口:" + inter);
        }

        //获取类的名称
        LOGGER.info("通过class.getName()获得类的全名:" + userClass.getName());
        LOGGER.info("通过class.getSimpleName()获得类的简名:" + userClass.getSimpleName());

        //获取字段 Field
        LOGGER.info("通过class.getDeclaredField(name)获取指定的字段:" + userClass.getDeclaredField("username"));
        Field[] fields = userClass.getDeclaredFields();
        for (Field field : fields) {
            LOGGER.info("通过class.getDeclaredFields()获取全部字段:" + field);
        }

        //获取构造器 Constructor
        LOGGER.info("通过class.getDeclaredConstructor(args...)获取指定的构造器:" + userClass.getDeclaredConstructor());
        Constructor[] constructors = userClass.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            LOGGER.info("通过class.getDeclaredConstructors()获取全部构造器:");
        }
        User user = (User) userClass.getDeclaredConstructor().newInstance();
        LOGGER.info("通过constructor.newInstance(args...)进行对象实例化:" + user.toString());

        //获取方法 Method
        LOGGER.info("通过class.getDeclaredMethod(args...)获取指定的方法:" + userClass.getDeclaredMethod("setPassword", int.class));
        Method[] methods = userClass.getDeclaredMethods();
        for (Method method : methods) {
            LOGGER.info("通过class.getDeclaredMethods()获取全部的方法:" + method);
        }
        userClass.getDeclaredMethod("setPassword", int.class).invoke(user, 9999);
        LOGGER.info("通过method.invoke(obj,args...)执行方法:" + user.toString());
    }
}

3.运行结果

2018-03-03 23:52:41 INFO  ReflectClassesDemo:28 - 通过class.getPackage()获得类的包名:package pers.hanchao.reflect.common
2018-03-03 23:52:41 INFO  ReflectClassesDemo:31 - 通过class.getDeclaredAnnotation(name)获取指定的注解:@pers.hanchao.reflect.common.MyAnnotationB()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationA()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationB()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:38 - 通过class.getModifiers()获得类的修饰符:public
2018-03-03 23:52:41 INFO  ReflectClassesDemo:41 - 通过class.getSuperclass()获得类的父类class pers.hanchao.reflect.common.SuperUser
2018-03-03 23:52:41 INFO  ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceAAA
2018-03-03 23:52:41 INFO  ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceBBB
2018-03-03 23:52:41 INFO  ReflectClassesDemo:50 - 通过class.getName()获得类的全名:pers.hanchao.reflect.common.User
2018-03-03 23:52:41 INFO  ReflectClassesDemo:51 - 通过class.getSimpleName()获得类的简名:User
2018-03-03 23:52:41 INFO  ReflectClassesDemo:54 - 通过class.getDeclaredField(name)获取指定的字段:public java.lang.String pers.hanchao.reflect.common.User.username
2018-03-03 23:52:41 INFO  ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public java.lang.String pers.hanchao.reflect.common.User.username
2018-03-03 23:52:41 INFO  ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public int pers.hanchao.reflect.common.User.password
2018-03-03 23:52:41 INFO  ReflectClassesDemo:61 - 通过class.getDeclaredConstructor(args...)获取指定的构造器:public pers.hanchao.reflect.common.User()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器:
2018-03-03 23:52:41 INFO  ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器:
2018-03-03 23:52:41 INFO  ReflectClassesDemo:67 - 通过constructor.newInstance(args...)进行对象实例化:User{username='张三', password='123456'}
2018-03-03 23:52:41 INFO  ReflectClassesDemo:70 - 通过class.getDeclaredMethod(args...)获取指定的方法:public void pers.hanchao.reflect.common.User.setPassword(int)
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.main(java.lang.String[])
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.toString()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.test(java.lang.Object)
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setPassword(int)
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public int pers.hanchao.reflect.common.User.getPassword()
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setUsername(java.lang.String)
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.getUsername() throws java.lang.NullPointerException,java.lang.ArrayStoreException
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.initUser(java.lang.String,java.lang.String)
2018-03-03 23:52:41 INFO  ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.demo(java.lang.String[])
2018-03-03 23:52:41 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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值