开场白:

大家好,我是潘师傅,各位好久不见,好久没有跟大家分享我的疯狂笔记了,大家有没有想我呢?哈哈...之前给大家整理分享的《史上最强JavaSE笔记》之数组篇不知道大家看了没有,大家要多多支持哈-0-,希望能够帮到更多人更轻松愉快的学习到Java-0-看了我的笔记,相信不久就能当上总经理,出任CEO,赢取白富美,走上人生巅峰.....哈哈...想想是不是有点小激动呢,那就来跟我学java吧~~

好了,话不多说啦,回归正题,这次跟大家分享的笔记内容呢,是反射,也是JDK5.0后的新特性,这个东西绝对是重量级的知识点,在学习框架的时候尤为重要,所以各位小伙伴儿听起来啦~~反射是很难的一个知识点,所以我把这个总结出笔记供大家参考学习,我也是反射没有掌握好,正在复习,可能废话比较多,但这种跟大家边聊边学知识的过程才能更容易放松哈,那么大家跟随我的理解一起来重新认识或复习一下反射吧~~GO!GO!GO!

正文:

1.什么是反射?

分析:在学习任何一件东西之前我们都需要先搞明白这个东西是什么,那么什么是反射呢,你们曾经认为什么是反射呢?是两个单纯的小伙伴儿在互相玩LoL吗?咳咳,你们可不要想歪了哈,其实反射的意思是这样滴~~是说当你用小锤子敲击别人的小腿膝盖时,别人就会产生反射,然后把你踢飞,嗯嗯,这才是反射,完整的说应该叫条件反射,哈哈,光也有的反射的....貌似距离我要讲的内容差着两万八千里呢,那么到底什么是反射呢?让我们来问下度娘~~

度娘说:反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。
    如果还不明白,那我来更详细的了解一下这个JDK5.0新特性的神奇的东西---反射,到底是何许技能?让我们连线各位老师们,看看他们是怎么理解反射的0. 0

金云龙 老师:反射是Java5版本提供的高级新特性,这种机制允许Java程序在运行状态中,对任意一个类都能知道该类的所有属性和方法:对任意一个对象,都能调用该对象的属性和方法。这种动态获取信息及动态调用对象的属性和方法的功能称之为Java的反射机制。

任童 老师:反射可以获取类中所有的内容。

杜宏 老师:剖析Java类中的各个组成部分映射成一个个java对象。
        怎么样?有没有对反射有些理解了?接下来让我们了解一下反射这个技能有什么作用吧~

2.反射有什么作用呢?

在我们编写Java类文件时,真正运行的是编译之后的".class"文件。而".class"文件在运行时,被加载到内存后,都是一个Class类的对象。我们可以通过Java5提供的反射机制来获取到该类的构造器(Constructor)、方法(Method)及成员变量(Field)等。

反射的作用众多,但最主要的功能还是:多用于框架和组件,写出复用性高的通用程序。
    
    如果还不懂0. 0可以看看下面我画的原理图~

3.反射卖萌图(我的美工不好,画的不好莫嫌弃0. 0)

4.反射练兵场(学习《反射秘籍》)

那么现在我们知道了反射这个技能是什么和有什么用,下面我们就来练兵场,跟随潘师傅我来学习这个技能吧~

技能1:Class类

介绍:Class代表的就是我们的字节码文件,.class文件加载到内存中就是一个Class对象

秘籍:要领悟这个技能,需要获取Class对象,而获取Class对象的方式有一下3种:

1.Class.forName("类全名"),

这种方式会抛出ClassNotFoundException异常,如果知道类的全名,则可以使用静态方法的这个方式获得Class对象,它不能在原始类型上,但可以用在原始类型数组上。例如:

Class c1 = Class.forName("java.lang.String");
System.out.println(c1.getName());//获取对象名称

输出结果:java.utils.Date
        
                    2.类名.class,

如果类型可用但没有对象,则可以在类型后加上".class"来获得Class对象。这也是使原始类型获得Class对象的最简单的方式。例如:

Class c2 = boolean.class;
System.out.println(c2.getName());//获取对象名称

输出结果:boolean

3.对象.getClass(),

如果一个类的对象可用,则最简单的获得Class的方法是使用Object.getClass(),不过这种方式只对引用类型有用。例如:

Class c3 = new Date().getClass();
System.out.println(c3.getName());//获取对象名称

输出结果:java.lang.String
          
            注意:1.获取到Class类实例之后,有什么用呢?

首先可以通过Class类实例的getName()和getSimpleName()方法,获取到对应类的全类名或类名。通过getPackage()可以得到一个类所在的包。

Class c4 = "fuck".getClass();
//输出结果:java.lang.String
System.out.println(c4.getName());
Class c5 = int[].class;
//输出结果:[I
//"["表示数组,"I"表示int类型
System.out.println(c5.getName());
//输出结果:int[]
System.out.println(c5.getSimpleName());

2.通过Class类实例的getSuperclass()方法,获取到对应类的完整继承链关系。

// 输出结果:
// class java.awt.Window
// class java.awt.Container
// class java.awt.Component
// class java.lang.Object
Class c = java.awt.Frame.class;
while (c.getSuperclass() != null) {System.out.println(c.getSuperclass());c = c.getSuperclass();
}

3.除了java.lang.reflect.ReflectPermission和java.lang.reflect包外,所有类都没有公共的构造方法。为了获得这些类的对象,必须使用Class类中适当的方法,对于不同的数据类型,Class对象的获得方式是不同的。

技能2:Constructor(构造器对象)

介绍:构造器的作用就是用来创建对象的,Constructor代表的是构造器对象,我们得到它后就可以实例化对象.

秘籍:要领悟这个技能,需要获取Constructor对象,而获取Constructor对象的方式有一下4种:

1.getConstructor():得到指定的public修饰构造器,参数表示是否具有参数的构造器
                    2.getConstructors():得到所有的public构造器,其中包含没有参数和有参数的
                    3.getDeclaredConstructor():得到指定的构造器,其中包含由public、private和protected修饰符的。
                    4.getDeclaredConstructors():得到所有的构造器,其中包含public、private和protected修饰符的。

注意:1.如果构造方法不是public。那么要获取其构造器对象使用  getDeclaredConstuctor()方法.
                      2.对于私有化权限,在使用前必须设置权限检查.
                            public void setAccessible(boolean flag)
                            值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查

3.在开发中,我们在得到Class时,一般会直接实例化类的对象.

4.Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象

技能3:Field(成员变量)

介绍:Field类代表某个类中的一个成员变量,病提供动态的访问权限。

秘籍:要领悟这个技能,可以通过以下4个招式获得此技能:

1.getFields()方法:获取Class类及父类的所有public成员变量。
                    2.getDeclaredFields()方法:获取Class类的所有成员变量,其中包含由public、private修饰符的。
                    3.getField方法():获取Class类及父类的具体成员变量。
                    4.getDeclaredField()方法:获取Class类的具体成员变量,其中包含由public、private修饰符的。但不能是父类中的方法。

注意: 1.Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取。
                        2.通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值。

技能4:Method(方法)

介绍:Method类代表某个类中的一个成员方法。

秘籍:要领悟这个技能,可以通过以下4个招式获得此技能:

1.getMethods()方法:获取Class类及父类的所有public方法。
                    2.getDeclaredMethods()方法:获取Class类的所有方法,其中包含由public、private修饰符的。
                    3.getMethod方法():获取Class类及父类的具体方法。
                    4.getDeclaredMethod()方法:获取Class类的具体方法,其中包含由public、private修饰符的。但不能是父类中的方法。

注意: Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法,调用invoke(Object, Object...)可以调用该方法,Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)

技能5:AccessibleObject      
      
           介绍:AccessibleObject类是Constructor、Method和Field三个类的父类。

秘籍:要领悟这个技能,可以通过以下2个招式获得此技能:

1.isAccessible()方法:判断当前成员是否可访问。
                    2.setAccessible()方法:设置当前成员是否可访问。
                
           注意:当Class类中的构造器、方法和成员变量是私有的时候,如果我们想反射操作的话,就必须先调用setAccessible(true)方法。

尾篇:

​        呼呼,折腾了整整一下午终于整理完了=. =,不知道小伙伴们都学会了没有0. 0,大家有什么意见可以来这个帖子给我留言跟我互动哦,欢迎大家来跟我交朋友-0-~

【史上最强JavaEE笔记】之反射篇(LOL新技能?)相关推荐

  1. RabbitMQ史上最强学习笔记(黑马)

    一.技术对比 MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列.也就是事件驱动架构中的Broker. 比较常见的MQ实现: ActiveMQ RabbitMQ Rocket ...

  2. 史上最强微商指南之能力篇

    转载于:https://www.cnblogs.com/yesliutao/p/4414508.html

  3. 12年来最大飞跃!黄仁勋发布史上最强GPU,世界首个实时光线追踪新一代图灵架构...

    "我们努力了十年."黄仁勋说:"这是GPU自2006年以来最重大的飞跃." 在刚刚的SIGGRAPH 2018主旨演讲中,黄仁勋将英伟达的GPU实力展现得淋漓尽 ...

  4. JVM面试题(史上最强、持续更新、吐血推荐)

    JVM面试题(史上最强.持续更新.吐血推荐) 文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : <尼恩Java面试宝典& ...

  5. 史上最强女游戏程序员

    也许你听说过John Carmack 和Tim Sweeney等大牛的名字,而向来游戏工业都是阳盛阴衰,适逢国际妇女节,今天我为大家介绍游戏业界一位史上最强女游戏程序员:Corrinne Yu. 简历 ...

  6. “史上最强”BigGAN公开TensorFlow Hub demo!

    还记得前些日子轰动一时的 BigGAN 模型吗?生成对抗网络(GAN)作为当前最热门的技术之一,最近在图像生成方面的成果颇受人关注.近日,由 DeepMind 和赫瑞瓦特大学组成的科研人员公布的 Bi ...

  7. 英伟达发布史上最强GPU,却叫停了自动驾驶车路测

    作者 | DavidZh 出品 | AI科技大本营(公众号ID:rgznai100) 当地时间 3 月 27 日,英伟达在美国圣克拉的 GTC 大会上推出多款产品. ▌显卡扩容,史上最强的 DGX-2 ...

  8. 【CV中的注意力机制】史上最强ResNet变体--ResNeSt

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [前言]:我们前面已经详细介绍了Attention机制和视觉注意力机制在图像分类结 ...

  9. 【经典干货】GitHub标星10万+,史上最强Google面试指南!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 一位从1997年就入行的Web工程师,立志要成为Google软件工程师,3年前写下 ...

最新文章

  1. MySQL(三)用正则表达式搜索
  2. 自定义classloader中的接口调用
  3. VHDL硬件描述语言(二)——子程序
  4. C++ Primer 5th笔记(chap 13 拷贝控制) 实例1测试和结果分析
  5. 【Python】Flask框架系列(三):session和cookie操作、get/post请求、钩子函数
  6. springboot整合mybatisplus中@Mapper与@MapperScan的使用
  7. TIOBE 6月编程语言排行榜:Python势不可挡
  8. python函数控制词典_Python 基础之集合相关操作与函数和字典相关函数
  9. Android 布局管理器 之 TableLayout
  10. LINUX 循环fork()
  11. 实现树状图_举个栗子!Tableau 技巧(132):用参数操作实现数据下钻
  12. 快速上手,定制第一个WES8镜像
  13. java修图sdk_手把手教你,如何用手机修图软件做出逼格超高的照片!
  14. PyCharm运行问题:AssertionError: Torch not compiled with CUDA enabled
  15. 微信小程序申请医疗-就医服务类目解决办法
  16. 怎么在Vc中打开MySQL数据库_在vc++中使用mysql数据库_MySQL
  17. 【安全资讯】5G打开潘多拉盒子:全球被感染物联网设备猛增100%
  18. 票务系统的主要售票方式
  19. 风暴魔域怎么在电脑上玩 风暴魔域电脑版玩法教程
  20. 031 Rust死灵书之Vec实现insert和remove

热门文章

  1. 总结了几百个ChatGPT模型的调教经验,确定不来看看?
  2. 80前的前辈,你们都做了些什么?!(四)
  3. 微信支付总结--小程序与H5页面微信支付
  4. LLVM学习入门(3):生成 LLVM 中间代码 IR
  5. 电源常用LDO线性稳压IC大全!
  6. 美标C63000铝青铜挤压棒C63000标准化学成分
  7. oracle数据库游标的使用
  8. 《Python语言程序设计》王恺 机械工业出版社 第七章课后习题答案
  9. 四个主要的连接池介绍!(建议收藏!)
  10. 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化...