反射入门

1、认识反射

“反”,有反就有“正”。正常情况先有类,再产生对象。所谓的反就是可以利用对象找到对象的出处:

在Object类里面提供有一个方法:取得Class对象:

public final Class getClass();

可以输出类的完整名称,就找到了对象的出处。

Class类对象的实例化:

java.lang.Class是一个类。这个类是反射操作的源头,所有的反射都要从此类开始进行。最关键的是这个类有三种实例化方式。

1、调用Object类中的getClass()方法:Class cls = mIntent.getClass();需要实例化对象,需要import导入类

2、使用“类.class”取得:Class cls = Intent.class。不需要实例化对象,需要import导入类

3、调用Class类提供的方法:Class.forName(String className)。不需要import语句导入一个明确的类

反射实例化对象。

当拿到一个类的时候,肯定用关键字new进行对象的实例化操作,但是如果有了Class类对象后,就可以不用New关键字也可以进行对象的实例化操作:

public T newInstance()相当于使用new调用无参构造函数。

有了反射之后,进行实例化的操作不再只是单单依靠关键字new完成了。反射也可以。

所以用反射获取一个对象实例化的步骤为:

1、先获取Class类的实例化对象:Class cls = Class.forName(“xxxxxx”);

2、用Class类的实例化对象获取制定类的实例化对象:Book book=(Book)cls.newInstance();


但是本来用关键字new一行代码就可以完成实例化操作,反射需要两步,这样好吗?


2、理解反射的作用

在任何开发中,一起的耦合都起源于new。

看工程模式。如果想要扩展,就必须改动工厂类中的if else。如果一直扩展,就需要一直修改工厂类。因为工厂类中是通过New产生对象实例的,所以New就是问题的关键。

如果工厂中用反射代替new,就不需要if else和new实例化每个if else中的对象。只需要传入类的完整名称,就可以解耦和。扩展性非常的强!

3、利用反射调用类的结构

a、使用反射调用构造:

之前所说的newInstance()方法实际上等于调用了无参构造函数,但是实际中可能么有无参构造函数,

Class中有方法可以取到构造:public Constructor[]getConstructors():取得全部构造。

和:public Constructor getConstructor(Class… paramterTypes):取得一个指定参数顺序的构造函数。

Constructor类是java.lang.reflect,这时候真正到了反射中。

实例化对象方法public T newInstance(Object… initargs)

所以用反射获取一个没有无参构造函数的类的实例化对象步骤为:

1、先获取Class类对象:Class cls = Class.forName(“xxxxx”);

2、获取指定参数类型顺序的构造函数:Constructor con = cls.getConstructor(Sring.class,double.class);

3、使用获取到的构造函数实例化对象:Object obj = con.newInstance(“第一个参数字符串类型”,10086.8);

所以建议,不管有多少个构造方法,都尽量提供一个无参构造函数,不然太麻烦了。

b、反射调用方法:

Class类中提供了一下方法用来获取类的方法:

public Method[]getMethods()

public Method getMethod(String methodName,Class… paramterTypes)

Method类似java.lang.reflect包下的,其中有个

public Object invoke(Object obj,Object… args)方法。

所以用反射调用方法的步骤为:

1、先获取Class对象:Class cls = Class.forName(“xxxxx”);

并获取对象Object object = cls.newInstance();//必须给出实例化对象

2、获取指定方法:Method setTitleMethod = cls.getMethod(“setTitle”,String.class);

3、调用方法:setTitleMethod.invoke(object,“一本书的标题”);//等价于Book对象.setTitle(“一本书的标题”)

但是这个过程中完全没有出现过Book。也就是说,利用反射可以实现任意类的制定方法的调用。

c、反射调用成员:

类中的属性一定要在本类实例化对象产生后才可以分配内存空间。

Class类中提供了取得成员的方法:

1、取得全部成员:public Field[]getDeclaredFields()

2、取得指定成员:public Field getDeclaredField(String fieldName)

Field是java.lang.reflect包下。其中有:

1、取得属性内容:public Object get(Object obj);

2、设置属性内容:public void set(Object obj,Object value)

所以反射调用成员的步骤为:

假设一个Book类,里面只有一个属性private String title;没有getter/setter方法。

1、先获取Class对象:Class cls = Class.forName(“xxx”);

2、获取对象:Object obj = cls.newInstance();

3、获取指定成员:Field titleField = cls.getDeclaredField(“title”);

4、设置属性内容:titleField.set(obj,“书的名字”);//相当于:Book类对象.title =“书的名字“

但是调用get还是会报错。因为封装性。

这时候需要用到:AccessbleObject

在java.lang.reflect.AccessibleObject类下面(JDK1.8修改):

~ Executable//可执行的

~ Constrictor

~Method

~Field

在这个类中有一个方法:

public void setAccessible(boolean flag)设置是否封装,

设置为false后,就是取消封装,这个时候再调用刚才的get就可以正常调用了。

构造方法和普通方法一样可以取消封装,只不过很少这样去做,而且对属性的访问还是应该是getter和setter方法完成。

学习完这些,反射算是入门了。

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,692评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • 学习Android的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群...
    kingZXY2009阅读 331评论 0 0
  • “你说胡离啊,我知道这个人,每天晚上12点准时,他就会出现在这个街角,看起来像刚下班回家。”街角的零售店老板说。 ...
    知鱼君阅读 187评论 0 1