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

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


反射其他文章
傻瓜教你反射(二) ---- Constructor
傻瓜教你反射(三) ---- Field
傻瓜教你反射(四) ---- Method

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()返回的是一个实例化对象(且不是原生类型(基本类型)的实例化对象)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 一、理解Class对象 (一)RRIT的概念以及Class对象的作用 认识Class对象之前,先来了解一个概念,R...
    守住阳光阅读 2,044评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • 摄影/文 陵子 离开家 想念着 妈妈的味道 这是于同学成长的 故乡 他总是时不时 对家乡 有莫名地渴望 那里有老...
    陵子心语阅读 715评论 2 18
  • 何舟没想到陈啾啾想去这么一个地方。她说,她想去一个街头随处可见接吻的情侣的地方。何舟笑了笑,问她为什么。“没有为什...
    柯渝子w阅读 320评论 0 0