傻瓜教你反射(一)——Class

作者: 吃啥呀 | 来源:发表于2018-07-18 15:28 被阅读25次

反射基础 Class类 铺垫动态代理


1.定义

Java中,每个class都有一个相应的Class对象
(一个类->编译完成->生成的.class文件->产生一个Class对象——用于表示这个类的类型信息)
Class类是一个final类

2.获取Class实例

1)创建一个简单的A类

package com.company;

public class A{
    private String s;
    public int b;

    public A(){
        System.out.println("A类无参数构造");
    }
    public A(String s){
        System.out.println("A类有参数构造:s:"+s);
    }
    private A(int a){
        System.out.println("A类有参数 私有构造:a:"+a);
    }

    public void show(){
    }
}

2)如何获得类A的Class实例

package com.company;

public class Reflect {
    public static void main(String[] args) throws ClassNotFoundException {

        /**
         * 1.使用类的对象获取
         *   每个类都使用Object作为父类
         *   Object类方法getClass()返回这个类的class文件对象
         *   方法返回值Class类型对象
         */
        A a = new A();
        Class classa = a.getClass();
        System.out.println(classa);

        /**
         * 2.使用类的静态属性获取
         *   类名.class 返回这个类的class文件对象.属性
         *   运行结果也是Class类型对象
         */
        Class classb  = A.class;
        System.out.println(classb);

        /**
         * 3.使用Class类的静态方法获取
         *   Class类静态方法forName(String类名)[注意:全类名]
         *   传递字符串类名获取到这个类的class文件对象
         *   方法返回值也是Class类型对象
         */
        Class classc;
        classc = Class.forName("com.company.A");//括号内需要一个字符串,所以要加引号
        System.out.println(classc);

        System.out.println(classa == classb);
        System.out.println(classb == classc);
    }

}

  1. 运行结果

A类无参数构造
class com.company.A
class com.company.A
class com.company.A
true
true

3.总结

方式 使用范围
getClass() 需要获取对象实例,仅能用于引用类型
.class 无需获取对象实例,既可以是引用类型也可以是基本类型
forName() 只需要类的全限定名

基本类型(基本数据类型):byte int short long float double char boolean
引用类型:(除上述基本类型外,剩下的即为引用类型)引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址。Java有 5种引用类型(对象类型): 接口 数组 枚举 标注

4.补充

基本类型获取Class实例,除了使用.Class,还可以通过基本类型的包装类的TYPE字段:
Class a = Double.TYPE;
Class b = Void.TYPE;

5.提问

Q1 为什么基本类型无法用第一种和第三种方法获取?
Q2 boolean怎么获取Class吗?
Q3 Class c = System.console().getClass();对吗?
(答案在文章末尾,嘻嘻~)

6.铺垫

java.lang.Class是所有反射操作的的入口,举例:

getSupperClass() :返回指定的父类
Class.getClasses() :获取所有内部所有public类,接口,枚举,包括本身和继承的成员类。
Class.getClassLoader() :每个class都有一个reference,指向自己的ClassLoader

/**
 * 使用Class中的API
 */
Class cls = A.class//获取Class实例
Object object = cls.getSupperClass();//以Class的实例为入口,使用其中的方法来获得A类的父类

A1 因为第一种.getClass()基于每个类都使用Object作为父类,Object类方法getClass()返回这个类的class文件对象,但是基本类型是原生类型,并没有Object作为父类

A2 boolean是原生类型,只能使用第二种方法获取Class实例,Class bl = boolean.class或者用补充的方法 Class bl2 = boolean.TYPE

A3 正确,因为System.console()返回的是一个实例化对象(且不是原生类型(基本类型)的实例化对象)

相关文章

  • 傻瓜教你反射(一)——Class

    反射基础 Class类 铺垫动态代理 1.定义 Java中,每个class都有一个相应的Class对象(一个类-...

  • 傻瓜教你反射

    Field 1) Class -> Field Class.getDeclaredField(String s)返...

  • 傻瓜教你反射(三)——Field

    Field 1) Class -> Field Class.getDeclaredField(String s)返...

  • 傻瓜教你反射(二)——Constructor

    反射基础 构造器 铺垫动态代理 阅读此文章需要先了解[Class类]:https://www.jianshu.co...

  • Java 学习基础篇 ---- Java反射与泛型

    一、反射 通过Class实例获取 class 信息的方法称为反射(Reflection)。 (一) Class 类...

  • 反射泛型容器

    一、 反射 1.1> 什么是反射 Class是反射的核心。在运行期进行实例的生成。 Class文件 属性 方法 (...

  • 反射Class

    class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 反射帮我们做一些程序运行时刻的...

  • java 反射

    1. 什么是反射操作 通过Class实例获取class信息的方法称为反射(Reflection),反射的目的是为了...

  • JAVA基础之反射

    1.通过反射获取类获取反射对象(反射入口):Class 1.Class.forName(全类名) 2.类名.cla...

  • java(代理和反射)

    反射和代理 反射 Class类和java.lang.reflect包 获取Class对象jdk提供了三种方式获取一...

网友评论

    本文标题:傻瓜教你反射(一)——Class

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