zoukankan      html  css  js  c++  java
  • 反射的学习

    一 . 反射的概念

    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中虽然非常重要,我们不掌握好像也不是很影响开发,但是我还是建议您多学一点,咱们学技术的,得技术过硬!

    作者:醉烟

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    idea设置全局ignore
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please ins
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistr
    kafka 删除 topic
    java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
    Centos中使用yum安装java时,没有jps的问题的解决
    Spring 整合Junit
    Spring纯注解配置
    Spring 基于注解的 IOC 配置
    打印java系统的信息
  • 原文地址:https://www.cnblogs.com/WangLei2018/p/10141057.html
Copyright © 2011-2022 走看看