美文网首页
利用反射获取类的信息

利用反射获取类的信息

作者: hello_world_cxm | 来源:发表于2021-02-04 21:53 被阅读0次

利用反射可以获得类的信息 比如属性,方法,有参无参构造方法

package day0204;

import java.util.ArrayList;

import java.lang.reflect.*;

public class TestClass {
/*
 * 类的对象:就是通过类实例化出来的一个对象
 * 类对象:是类文件(**.class)加载jvm的产品,其中类对象记载了类名,属性,方法,构造方法
 * 类对象就好比动物园动物的简介,上面叙述了某种动物的特点,然后笼中的动物就是 类 的实例化对象
 * 问题:如果获取类对象呢?
 * Field对象 存放所有类的属性对象
 * */
    public static void main(String[] args) throws Exception{   //声明了下面如果发生异常就throws一个异常出来
        Class c1 = ArrayList.class;  //返回类对象
        Class c2 = new ArrayList().getClass();  //返回的是类对象
        Class c3 = new ArrayList().getClass();  //类的对象.getClass 返回的是类对象
        
        Class c4 = Class.forName("java.util.ArrayList");  //获取ArrayList的类对象 而不是类的对象  不能省略包名
        /*
         * 注意forName,如果本来ArrayList这个类没有加载的话,forName就会加载一次ArrayList,然后返回类对象
         * 为什么想要加载这个类?因为加载这个类,就能调用静态代码块
         * */
        
        
        System.out.println(c1==c2);  //结果 true
        System.out.println(c2==c3);  //结果 true
        System.out.println(c3==c4);  //结果 true  都是同一个类
        
        System.out.println(c1.getName());  //返回类名
        System.out.println(c1.getPackageName());
        System.out.println(c1.getSuperclass());
        Class[] cc = c1.getInterfaces();  //返回的是类对象的数组 返回ArrayList的直接继承接口
        for(Class c:cc) {
            System.out.println(c.getName());
            //Serializable Clonable List RandomAccess 其中ArrayList直接继承了List接口。List直接继承了Collection,Iterable接口
        }
        System.out.println("-------------------------------------------属性");
        
        /*
         * 获取类的属性对象 属性包括属性值 属性名 属性类型 属性初始值 这些共同构成属性对象。这个属性对象被装在Field里面 Field相当于于一个容器
         * 类对象存储类的信息,那么属性对象存储属性的信息 一个方法信息存放在Method对象里面,构造方法信息则存储在Constructor对象里面
         * 注意:类对象.getFields()方法的是本类或者父类的 公开的 属性,私有无法访问 ArrayList本类以及父类没有公开属性
         * 类对象.getDeclaredFields()获取类对象 本类的所有的属性 无论是公开还是私有,但是不能获取父类
         * */
        Field[] fs = c2.getDeclaredFields();
        for(Field f :fs) {
            System.out.println(f);
        }
        System.out.println("-------------------------------------------方法");
        /*
         * 类对象.getMethods() 获取本类 父类的 公开方法 返回是Method数组
         * 类对象.getDeclareMethods() 获取 本类所有 public/private/proteced方法
         * */
        Method[]  ms = c2.getDeclaredMethods();
        for(Method m :ms) {
            System.out.println(m);  //不仅返回本类公开方法且返回从父类继承的公开方法
        }
        System.out.println("--------------------------------------------构造方法");
        /*
         * 类对象.getConstructors() 获取本类 父类的 公开有参/无参构造方法 返回的是Constructor数组
         * 类对象.getDeclaredConstructor() 获取本类 的有参或者无参构造方法
         * */
        Constructor[] cs = c2.getDeclaredConstructors();
        for(Constructor c:cs) {
            System.out.println(c);
        }
    }

}

相关文章

网友评论

      本文标题:利用反射获取类的信息

      本文链接:https://www.haomeiwen.com/subject/bgeitltx.html