查看类信息

阅读:315

目录介绍

  • 01.Java反射查看类信息
  • 02.获得Class对象
    • 2.1 Class.forName()
    • 2.2 类.class
    • 2.3 对象.getClass()
  • 03.获取Class父类对象

01.Java反射查看类信息

  • 在取得 Class 对象后,就可以操作 Class 对象的公开方法取得类基本信息
    private void method1() {
        Class<?> cl = Student.class;
        LogUtils.i("类名称:"+cl.getName());
        LogUtils.i("类名称:"+cl.getName());
        LogUtils.i("简单类名称:"+cl.getSimpleName());
        LogUtils.i("包名:"+cl.getPackage());
        LogUtils.i("是否为接口:"+cl.isInterface());
        LogUtils.i("是否为基本类型:"+cl.isPrimitive());
        LogUtils.i("是否为数组对象:"+cl.isArray());
        LogUtils.i("父类名称:"+cl.getSuperclass().getName());
    }
    

  • 输出结果为
    类名称:net.zhifou.other.ui.activity.Student
    类名称:net.zhifou.other.ui.activity.Student
    简单类名称:Student
    包名:package net.zhifou.other.ui.activity
    是否为接口:false
    是否为基本类型:false
    是否为数组对象:false
    父类名称:java.lang.Object

02.获得Class对象

  • 每个类被加载之后,系统就会为该类生成一个对应的Class对象。通过该Class对象就可以访问到JVM中的这个类。
  • 在Java程序中获得Class对象通常有如下三种方式:
    • 1.使用Class类的forName(String clazzName)静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定名(必须添加完整包名)。
    • 2.调用某个类的class属性来获取该类对应的Class对象。
    • 3.调用某个对象的getClass()方法。该方法是java.lang.Object类中的一个方法。
    //第一种方式 通过Class类的静态方法——forName()来实现
    class1 = Class.forName("net.zhifou.reflection.Person");
    //第二种方式 通过类的class属性
    class1 = Person.class;
    //第三种方式 通过对象getClass方法
    Person person = new Person();
    Class<?> class1 = person.getClass();
    

2.1 Class.forName()

  • 1.通过JVM查找并加载指定的类(上面的代码指定加载了com.fanshe包中的Person类)
  • 2.调用newInstance()方法让加载完的类在内存中创建对应的实例,并把实例赋值给p
    • 注意:如果找不到时,它会抛出 ClassNotFoundException 这个异常,这个很好理解,因为如果查找的类没有在 JVM 中加载的话,自然要告诉开发者。
    Class<?> cls=Class.forName("com.yc.Person"); //forName(包名.类名)
    Person p= (Person) cls.newInstance();
    

2.2 类.class

  • 1.获取指定类型的Class对象,这里是Person
  • 2.调用newInstance()方法在让Class对象在内存中创建对应的实例,并且让p引用实例的内存地址
    Class<?> cls = Person.class;
    Person p=(Person)cls.newInstance();
    

2.3 对象.getClass()

  • 1.在内存中新建一个Person的实例,对象p对这个内存地址进行引用
  • 2.对象p调用getClass()返回对象p所对应的Class对
  • 3.调用newInstance()方法让Class对象在内存中创建对应的实例,并且让p2引用实例的内存地址
    Person p = new Person();
    Class<?> cls= p.getClass();
    Person p2=(Person)cls.newInstance();
    

03.获取Class父类对象

  • 先看一下代码
    //在AppBarLayout类中
    public static class Behavior extends AppBarLayout.BaseBehavior<AppBarLayout>
    //BaseBehavior的父类
    protected static class BaseBehavior<T extends AppBarLayout> extends HeaderBehavior<T>
    

  • 反射获取父类
    Class<?> superclass = AppBarLayout.Behavior.class.getSuperclass();
    

  • 反射获取父类的父类
    Class<?> superclass = AppBarLayout.Behavior.class.getSuperclass();
    headerBehaviorType = superclass.getSuperclass();

赞赏支持


精彩留言

发表评论