Java:反射

编程语言分类(以程序运行时结构及变量类型的可变性作为标准):

--|1.静态语言

--|2.动态语言:程序运行时,允许改变程序的结构及变量类型的语言;

~由此,Java、C++、C#是非动态语言,而Perl、Python、Ruby是动态语言

·Java中按照加载时机将类的加载类型划分为编译时检查类型、运行时加载类型

1.编译时检查类型的类(运行时已识别类型:RTTI--Run Time Type Identificated):编译时识别,该类型的类在编译时由编译器检查确认,在运行时加载

2.运行时加载类型(反射:主要用于构造工具):从其他地方得到一个未知类的对象,在程序运行时动态的将该未知类对象所在类文件加载到Java Virtual Machine中

---- 反射(Reflective): 能够分析类能力的程序

···反射库(Reflection Library)-丰富且精心设计的工具集,方便编写能够动态操纵Java代码的程序。这项功能被大量应用与JavaBeans中,JavaBeans为Java组件的的体系结构,在设计或运行中添加新类时,可以快速应用开发工具动态查询新添加类的能力(具体体现为获得新类的实例域及方法);

·反射机制的作用:

    1.程序运行时动态分析类的能力

    2.程序运行时动态查看对象,例如:编写一个toString方法供所有类使用

    3.实现通用的数组操作代码

    4.利用Method对象(对象类似于C++中的函数指针)

反射中的类Class、Constructor、Method


·Class类(泛型类--例如:Employee.class的类型是Class<Employee>):保存对象在程序运行时的类型信息(程序运行期间,Java运行系统始终为所有的对象维护一个被称为运行时的类型标识。该信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行),一个Class对象表示一个特定类的属性

Class类中的方法:

1.public String getName(){} -- 返回类的名字



2.public static Class forName(String className){} -- 返回对应className的类的Class对象(className:类或接口的全名,即包名.类名),需处理异常:ClassNotFoundException

3.T表示任意Java类型:则T.class将代表T对应的Class类对象

4.任意对象都有的方法:public Class getClass(){} -- 返回调用该方法的对象的所属类的Class类对象

注:2、3、4为获取Class类对象的方法(以下仅针对获取Class类对象这一过程)

>其中编号为2的方法仅需要类的名字,而不需要导入包,更加具有普遍意义(反射 -- 运行时检查,处理的运行时异常为ClassNotFoundException);

>编号为3的方法需要类的名字,且需要导入相应的包(编译时检查);

>编号4的方法需要类对象且需要导入相应的包(编译时检查);



5.public Method getMethod(String methodName, Class...parametersType){} -- 返回特定方法的Method对象 

>第一个参数为方法名字,之后的参数为要获取方法的参数所在类的Class对象(以下同此格式可以此方式解释)

6.public Method[ ] getMethods(){} -- 返回Class对象指向的类中以public作为访问权限修饰符的方法

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

7.public Method[ ] getDeclaredMethods(){} -- 返回Class对象指向的类中的所有方法(包括protected、private修饰的方法)的Method对象的数组;

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

注:5、6、7为Class类中获取Class对象指向的类中的方法的方法



8.public Constructor getConstructor(Class...parameterTypes){} -- 返回Class对象中特定构造器的Constructor对象

9.public Constructor[ ] getConstructors(){} -- 返回包含Class对象中公共构造器对象的Constructor数组

10.public Constructor[ ] getDeclaredConstructors(){} -- 返回包含Class对象中所有构造器对象的Constructor数组

注:8、9、10为Class类中获取Class对象中的构造器的方法

11.public Field getField(String name){} -- 返回Class对象中的特定实例域的Field对象

12.public Field[ ] getFields(){} -- 返回包含Class对象中公共实例域对象的Field数组

13.public Field[ ] getDeclaredFields(){} -- 返回包含Class对象中所有实例域对象的Field数组

注:11、12、13为Class类中获取Class对象中的实例域的方法(因封装原理,一般getDeclaredFields(){}是无意义的)

14.public void setAccessible(boolean flag){} -- 设置访问Class对象所指向的类的私有属性权限


Method类:描述方法的类

Method类对象指向具体的方法,类似于C、C++中的函数指针;

Method类中的方法:

public void invoke(String methodName, Object...parameters){} -- 调用Method类对象所指的方法(在运行时动态调用需要的方法)


Constructor类:描述构造器的类

Constructor类对象指向具体的构造器,本质是函数,也类似于C、C++中的函数指针;

Constructor类中的方法:

public Object newInstance(Object...parameters){} -- 调用Constructor类对象所指的构造器


Field类:描述实例域的类

关于实例域(Field):

-- 封装:从形式上看封装不过是将数据和行为组合在一个包内,并对对象的使用者隐藏了行为的实现方式。对象中的数据称为实例域(instance field),这些值的集合就是这个对象的当前状态(state)。向对象发送一条消息,它的状态就有可能发生改变。

对象的主要特性:

    1.对象的行为(behavior) -- 可以对对象施加哪些操作,或可以对对象施加哪些方法

    2.对象的状态(state) -- 当施加方法时,对象如何响应

    3.对象表示(identity) -- 如何辨别具有相同行为与状态的不同对象

大致上的含义是改变数据的方式、改变后的数据代表的意义、标示相同数据的不同含义

>由此,对象即一组数据,而数据能够通过逻辑运算实现人为赋予的抽象意义!!


!·待补充 -- 动态代理

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

推荐阅读更多精彩内容