JAVA 基础 之 反射

一:Class类的使用


1: Class 类介绍

    在Java中除了基本数据类型和静态的东西都是对象,都是Java.lang.class的对象,

    在上面的Code我们创建了一个Food类,实例化了一个food的对象, 其实Food这个类也是一个对象,是Java.lang.class的对象 。我们知道,通过new A(A任意一个类)来得到一个A类的对象,同样任意一个类都是class的对象,我们也可以获取到Class的对象

    获方式如下:

          1:Class c1 = Food.class()

          2:  Class c2 = food.getClass();

            3: Classc3 = Class.forName(“com.xxx.xx”);

2:动态加载类

      程序都分为编译期和运行期2个时期。

      编译期:是指编译器将源代码翻译为机器能识别的代码,java为编译为jvm认识的字节码文件。 

      运行期:则是指java代码的运行过程。

        在我们的FactoryFood中,我们需要根据实际情况引很多个类,而且我们需要编译期编译很多类,但实际可能只会用到1,2个类。

      在我们的DynamicFactory中,我们没有引入任何实体类,而是由程序动态的加载和创建对象。需要什么类就传入什么类的包.类名即可

总结:通过动态加载类的方式,我们可以随意的添加和删除类而不需要重新编译。然而静态类却不行,每次新增类都需要重新编译程序。

二:获取方法信息


    下面让我们通过反射的方式来获取类的名称,方法,变量,函数的参数,返回值

    getMethods():获取所有的public方法,包括从父类继承过来的,如上面的wait方法(在java中我们新建的类默认继承Object,所以Food类里面就获取到了warit方法)

    getDeclareMethods():获取类自己申明的方法包括(public, private, protect)通过上面的输出我们可以看出来,使用getDeclareMethods获取到了updateFood(private)但是没有获取到wait(从父类继承的)

三:获取成员变量


    前面我们介绍了方法的获取方法,那成员变量依然可以获取,而且成员变量也是对象是Java.lang.Field的对象,

    我们先在类中添加一个public Character character的成员变量

    下面演示获取成员变量信息的例子

    getFields()只能获取public的成员变量,在输出信息中,我们可以看到只输出了一个character的成员变量

    getDeclareField()可以获取该类所有自己声明的成员变量包括public的,private的和protected,以及default类型的

四:获取构造函数信息


    类是对象,成员变量是对象,同样构造函数也是对象,是Java.lang.Constructor的对象。

    下面让我们来获取构造函数的参数列表和参数类型

    getConstructors():获取所有的public的构造函数(也有private的构造函数,比如:单例模式中就存在)

    getDeclareConstructors():获取所有自己申明的构造函数(构造函数只能是自己申明的)

    同样我们也可以通过getInterface, getSuperClass获取接口和父类

    注:只要我们得到类的类型,我们就可以得到该类的所有信息

五:方法的反射


    前面讲述了一大堆获取方法,变量,参数,返回值的操作,接下来就来实际操作通过反射来调用我们的方法,指令method.invoke();

    首先,我们要调用方法就要先获取方法信息,要获取方法信息就要获取类信息,就是获取类类型

    首先我们在Food类中添加如下三个方法:

    然后我们来反射调用这三个方法:

    在上面的code中,我们先调用setDefaultName来给Food命名,然后在调用getFoodName来检查我们是否成功的通过反射完成了设值,然后我们再调用有参数的方法setFoodNumber,来重新设置name和 number然后再调用getFoodName来检查我们是否成功的通过反射完成了设值

    从输出的信息,我么可以得知我们成功的通过反射来完成了Food方法的调用,但是我们发现,第一次的输出是null,因为我们的第一次调用的函数是无返回值的。

    注:当有返回值,Object为具体的返回值,无返回值时,Object为null函数有参数时,调用时传入具体的参数,多个参数,传入一个Object数组;无参数调用时不传参数

深入理解:

    反射是编译之后的操作,前面的文章我们讲泛型,说泛型是编译期的安全检查,那我们就可以通过反射来给泛型插入数据而不出现编译错误:

    通过上面的输出结果我们可以发现我们定义了String的ArrayList,添加了一个”First”,这时候size是1,然后又通过反射来添加一个22到ArrayList中,输出的 Size是2。所以通过反射可以绕过泛型的检查(因为编译器在编译期会做泛型擦除)。

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

推荐阅读更多精彩内容

  • 课程地址:Java基础之 — 反射(非常重要) (使用的前提条件:必须先得到代表的字节码的Class,Cla...
    叨唧唧的阅读 686评论 0 2
  • (转自csdn) 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示...
    尼尔君阅读 227评论 0 1
  • Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...
    厨房有只偷吃的猫阅读 763评论 0 0
  • 一、两个概念 编译型语言:程序在执行之前需要将源代码编译成机器语言,再由机器运行机器码(二进制)。像C/C++、D...
    M_JCs阅读 358评论 0 0
  • 1)类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进...
    糖宝_阅读 191评论 0 2