• 反射的学习


    一 . 反射的概念

    1. 反射的前提是知道类的名字
    2. 在java中,反射是一种机制,指程序在运行过程中,对于任何一个类都可以通过反射获取其所拥有信息.

        例如:成员变量(字段),构造方法,方法,类名,包名,接口等。

    二 . 反射的作用

    1. 在运行时判断任意一个对象所属的类。
    2. 在运行时获取类的对象。
    3. 在运行时访问Java对象的属性,方法,构造方法等。

    三. 反射的优缺点

      优点:动态创建和编译对象(灵活)

        动态编译:指程序在运行时确定对象类型,绑定对象。动态编译最大限度的发挥了Java的灵活性,体现了多态的应用,降低了类之间的耦合性。bug一般会出在运行时期。反之为静态编译。

        静态编译:在编译期间确定对象类型,绑定对象,即通过,bug一般会出在编译时期(不灵活)。

        例子:一个大型的软件,不可能一次就把它设计的很完美,当这个程序编译后,发布了。当发现需要更新某些功能时,我们不可能要求用户把以前的卸载,再重新安装新的版本。假如这样的话,这个软件肯定是没有多少人用的。如果采用静态编译的话,就需要把整个程序都重新编译一遍(重装软件),才可以实现功能的更新。而采用反射机制的话,就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现功能的更新。

      缺点:对性能有所影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只执行相同的操作。

    四. 反射的重点

      类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、方法、构造方法)

      类的对象:基于某个类new出来的对象,也称为实例对象

      关键字:Class

      获取类对象的三种方式

        类名.class ;

        对象(类的对象).getClass() ;

        Class.forName(包全名); // 例如 “java.util.ArrayList” 

      反射常用api

        反射包为:Java.lang.reflect

        Class

          getName();以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称。

          getPackage();获取此类的包。

          ===========================================

          getFields();//获取该Class的所有公开字段(包括父类)

          getField(String name);//根据name获取对应的Field对象

          getDeclaredFields();//获取当前类的所有字段;(不包括父类)

          getDeclaredField(String name);//更具name匹配当前类相符合的类;

          ============================================

          getMethods();//获取此类和父类所有的公开方法

          getMethod(String name,Class<?>... parameterTypes);//前一个参数为 方法名,后一个参数是入参,需要根据实际需求添加参数。

          getDeclaredMethods();//获取此类中所有的方法(不包括夫类);

          getDeclaredMethod(String name,Class<?>... parameterTypes);//根据name和入参获取相关方法对象。

          ============================================

          至于其它方法,请参考jdkapi

    我的感言:

      反射是一们相对偏底层的技术,往往用在一个工具或者框架的实现上。反射在Java中虽然非常重要,我们不掌握好像也不是很影响开发,但是我还是建议您多学一点,咱们学技术的,得技术过硬!

    作者:醉烟

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    poj1978
    poj3505
    免费专利讲座
    没有找到MFC80UD.DLL"没有找到MFC80UD.DLL,
    新手学C++/CLI及C#
    怎样激发技术人员的创新力?
    关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
    绝好的一套针对初学者的JavaScript教程
    VC如何将自身进程提升至管理员权限
    如何寻找优秀的专利代理人
  • 原文地址:https://www.cnblogs.com/WangLei2018/p/10141057.html
Copyright © 2020-2023  润新知