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

利用反射获取类的信息

作者: 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