java反射与注解(一):Class类简介

作者: dodo_lihao | 来源:发表于2016-11-27 14:47 被阅读191次

    Class类简介

    Cass类位于jdk的java.lang包下



    虽然不在反射包下面,但是类中import了很多反射的类


    所以和反射有很大关系
    反射,在平时使用中,不是很多。
    但是,在一些特殊的地方,通常有一定的好处
    例如,动态去获取值,动态得到对象,调用方法,或者调用别人类中private的方法等
    当然,还有很多其他的好处
    里面有对应的ClassLoader, 以及 native的jni理解 ,
    由于个人能力问题,我们掠过ClassLoader和Class中的jni理解


    具体调用

    通常分为2种类型,3中写法

    • 如果有对象,可以获取这个对象Class类中的信息
      例如:
    Class<?> c1 = new DummyClass().getClass(); 
    
    • 如果没有对象,可以通过
    Class<?> c2 = DummyClass.class;
    或者(下面这种需要try,catch)
    Class<?> c3 = Class.forName("xxx.xxx.DummyClass"); 
    

    Class类型,简单例子

    比如,这里我们写了一个DummyClass,里面就只有name,age对应的2个属性
    再写了setter,getter,toString方法

    我们用几种方式去获得对应的Class对象,再打印getName方法

    • 对象的方式
    Class<?> c1 = new DummyClass().getClass();
    System.out.println(c1.getName());
    
    • 我们发现,可以得到对应的Class对象,并且打印
    • com.aohuan.dodo.javacode.reflect.utils.DummyClass
    • 类名.class方式
    c1 = DummyClass.class;
    System.out.println(c1.getName());
    
    • 我们发现,可以得到对应的Class对象,并且打印
    • com.aohuan.dodo.javacode.reflect.utils.DummyClass
    • Class.forName("完整类名")的方式
    try {
        c1 = Class.forName("com.aohuan.dodo.javacode.reflect.utils.DummyClass");
        System.out.println(c1.getName());
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    • 我们发现,可以得到对应的Class对象,并且打印
    • com.aohuan.dodo.javacode.reflect.utils.DummyClass

    newInstance()方法

    上面的3种方式,其实Class,只是对应类型
    我们如果要初始化对象
    可以用Class的newInstance()方法实例化对象
    比如,上面的c1
    实例化代码,大体为:

    try {
        DummyClass bean11 = new DummyClass().getClass().newInstance();
        System.out.println(bean11);
    } catch (InstantiationException e1) {
        e1.printStackTrace();
    } catch (IllegalAccessException e1) {
        e1.printStackTrace();
    }   
    

    我们运行后,打印为:
    DummyClass{age=0, name='null'}
    也就是,DummyClass类中的toString方法,只是field没有赋值,所以都是null
    注意,这里DummyClass做了toString方法的复写


    Class属性认识

    我们看一下,对应的一些属性

        private native Field[]       getDeclaredFields0(boolean publicOnly);
        private native Method[]      getDeclaredMethods0(boolean publicOnly);
        private native Constructor<T>[] getDeclaredConstructors0(boolean publicOnly);
        private native Class<?>[]   getDeclaredClasses0();
    

    其实,我们大体可以看见,对应的native属性

    • Field[] :对应的属性(字段)
    • Method[] : 对应的方法
    • Constructor<T>[] : 对应泛型类T的构造函数
    • Class<?>[] : 声明的类

    具体获取,可以通过Class对象的方法获得

    • Field:

    • getFields() : 获取 包括父类的public的 Field[]

    • getDeclaredFields() : 获取 本类所有的 Field[]

    • getField(name) : 根据 名字,获取包括父类具体的public Field

    • getDeclaredField(name) :根据名字,获取本类Field

    • Method:

      • getMethods() : 获取 包括父类的 public的Method[](public)
      • getDeclaredMethod() : 获取 本类中所有的 Method[]
      • getMethod(name, parameterTypes) : 根据 名字,参数类型(可变参数), 获取具体 Method(public)
      • getDeclaredMethod(name, parameterTypes) : 根据 名字,参数类型(可变参数), 获取具体 Method
    • Constructor:

      • getConstructors() : 获取 包括父类的所有public的 Constructor[]
      • getDeclaredConstructors() : 获取 本类所有的 Constructor[]
      • getConstructor(parameterTypes) : 根据 参数类型(可变参数), 获取具体 Constructor(public)
      • getDeclaredConstructor(parameterTypes):根据 参数类型(可变参数), 获取具体 Constructor

    其他

    当然,除了常见的 属性 Field,方法 Method,构造 Constructor
    Class还会操作 注解
    例如:
    Class对象的

    • getAnnotation(annotationClass)
    • getAnnotations()
    • getDeclaredAnnotations()

    简单总结

    这里大致了解下
    Class的简单使用 和 大体作用

    其他的内容,后续一起学习具体代码,可以见
    https://github.com/2954722256/use_little_demo
    对应 javacode 的 Module,对应的reflect包

    相关文章

      网友评论

      • 皮球二二:补充一下,不带declared的方法也可以获取到父类的public
        ea28beaa1475:对多个dex 提示ClassNotFound 怎么解决呢
        dodo_lihao:@r17171709 对哦,注释没写全,谢谢提醒,马上修改
        dodo_lihao:@r17171709 嗯嗯,谢谢提醒。后面文章有说明到的

      本文标题:java反射与注解(一):Class类简介

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