java 反射基础

1.java反射基础

2.java反射进阶


反射的两个显著的作用

  • 反编译: .class —> .java
  • 通过反射机制访问java对象中的属性、方法、构造方法等。

反射机制需要使用到的类

  • java.lang.Class ————类的创建
  • java.lang.reflect.Constructor————反射类中的构造方法
  • java.lang.reflect.Field————反射属性
  • java.lang.reflect.Method————反射方法
  • java.lang.reflect.Modifier————访问修饰符的信息
实现反射,实际上是得到Class对象,使用java.lang.Class这个类。这是Java反射机制的起源,当一个类被加载后,Java虚拟机会自动产生一个Class对象。

1.三种获取Class对象的方式

(1).反射机制获取类,以简单获取Reflect类为例

Class  c1=Class.forName("com.zhangqing.Reflect")

(2).java中每个类都有Class属性

Class c2=Reflect.Class;

(3).通过getClass方法获取

Class c3=new Reflect().getClass();

这三种初始化方式的区别在于:

  • 第一种Class.forName方式,会让ClassLoader装载类,并执行类的初始化。
  • 第二种getClass()方式,返回类对象运行时真正所指的对象、所属类型的Class对象。
  • 第三种Reflect.class方式,ClassLoader装入内存,不对类进行类的初始化操作。\color{red}{区分的重点在于是否进行初始化和是否在实例中获取}

2.无参数创建对象

(1). forName 中的参数需要填入全路径名

Class c=Class.forName("com.zhangqing.Reflect");
Object o=c.newInstance();

New和newInstance()的区别

  • New是直接创建一个实例,同时完成类的装载和连接。
  • newInstance()是使用类的加载机制,创建了一个实例。这个类已经被加
    载,并且已经被连接,这是因为forName会让ClassLoader装载类和进行类的初始化工作,其实际创建的是Object对象.
  • 使用类加载机制可以很灵活地创建类的实例,当更换类的时候,无须修改以前的代码。
  • New是一个关键字,可以传入参数取决于对象的构造方法,而newInstance是一个方法,只能传入无参数构造。

3.有参数创建对象

有参构造方法在调用参数时需要药天蝎的参数类型:

Constructor<?> csr=c.getConstructor(String.class,int.class);
Object o=csr.newInstance("zhangqing",26);

这里的getConstructor方法会返回一个Constructor对象,它反反映类此Class对象所表示的类指定的公共构造方法。

4.反射类中的属性需要使用Field对象

    Field field=cls.getDeclaredField("name");

使用setAccessible取消封装,特别是可以取消私有字段的访问限制。

    field.setAccessible(true);

O是属性所在的类对象(类的实例)

    field.set(0,"zhangqing");
  • Field类描述的是属性对象,其中可以获取到很多属性的信息,包括名字、属性类型、属性的注解。
  • 在安全管理器中会使用checkPermission方法来检查权限,而setAccessible(true)并不是将方法的权限改为public,而是取消Java的权限控制检查,所以即使是public方法,其accessible属性默认也是false.

5.修改属性中修饰符

    Field field=cls.getDeclaredField("name");
    String priv=Modifier.toString(file.getModifiers());
  • getModifiers()返回的是一个int类型的返回值,代表类、成员变量、方法的修饰符。

6.反射类中的方法

(1).获取类中的方法

   Method m=c.getDeclaredMethod("setName",String.class);

(2).通过反射调用方法

    m.invoke(c,"zhangqing");
  • getDeclaredMethod()获取的是类自身声明的所有方法,包含public,protected和private方法。
  • Method中的invoke方法用于检查AccessibleObject的override属性是否为true.
  • AccessiobleObject是Method、Field、Constructor的父类,override属性默认为false,可调用setAccessible方法改变,如果设置为true,则表示可以忽略访问权限的限制,直接调用。

进阶内容见下一篇java反射进阶

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

推荐阅读更多精彩内容