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

开场白:                                                                

        大家好,我是潘师傅,各位好久不见,好久没有跟大家分享我的疯狂笔记了,大家有没有想我呢?哈哈...之前给大家整理分享的《史上最强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-~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值