zoukankan      html  css  js  c++  java
  • java反射(1)

    反射反射,程序员的快乐.


             第一次了解反射这个概念是从<<大话设计>>中所了解到的.当时只是对概念的模糊了解,具体对它的机制并不清楚.最近在学习并实践SSH框架,其中Spring框架中核心的内容是IOCInversion of Control)控制反转,如果我们对java的反射机制有了一定的了解会对我们学习Spring框架有很大的帮助.接下来我们开始说说Java的反射机制.


             什么是java反射?

             JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

             上面是官方的说法,理解上稍微有点困难.接下来跟着笔者的思路来.


              若想要理解java的反射,首先需要了解内容是Class.我们都知道.java的世界中一组对象可以抽象成为一个类,但是Java中的各种类应该用什么来表示呢?这就是Class类的作用.需要注意的是此Class非定义class类的小写class.Class类是对java各个类的抽象.


              类一般都是有对象的,Class类的对象具体是什么呢?

               Class类的具体对象是各个类在内存中的字节码.每一个类被类加载器加载到内存中都会占据一定的空间,而这个空间里的内容就是字节码,不同的字节码类是不同的,而这些空间都可以用对象来表示.也就是Class上类的对象.

               例如: ClassclsDate=Date.class   其中clsDate就是表示Date类在内存中的字节码.clsDate的类型是Class类型.上面是一种获取字节码对应的实例对象的一种方式,还有另外两种方式:

                1  对象.getClass()    例如:new Date().getClass()

                2  Class.forName("类名") 例如:Class.forName("java.util.Date")


            Class对象==类在内存中的空间的内容即字节码

            通过Class类来获取Class对象

           获取Class对象的三种方式:   

        1、   Class对象=对象.getClass()      

      2、 Class对象=Class.forName("类名")  

      3、 Class对象=类名.class    

                Class对象.newInstace() 可以获取该类的对象,但是是Object类型的,要强制类型转换

               

               到此为止,我假定读者已经快要理解了Class类的概念,它跟反射有什么关系呢?

               我们知道,一个java类中用一个Class类的对象来表示,一个类中的具体组成部分,例如成员变量,方法……等信息也可以用一个个的java类来表示.而作为java类的Class类理所应当的提供获取这些组成部分的方法,而这些信息就是需要用相应类的实例对象来表示,例如:Field,Method等等类的对象.这些内容官方称之为:Java反射API.

              

    java.lang包下

             Class<T>:表示一个正在运行的 Java 应用程序中的类和接口,是Reflection的起源

    java.lang.reflect包下

    Field 类:代表类的成员变量(也称类的属性)

    Method类:代表类的方法

    Constructor 类:代表类的构造方法

    Array类:提供了动态创建数组,以及访问数组的元素的静态方法

     

               例如:我们熟知的Date,它有Date.getDate()方法,也有Date.getHours()方法,而每一个方法都是Method类的一个对象,如下:

               Method   medDay=Date.getDate();

    Method   medHour=Date.getHours();


               通过上述方式我们获得了一个Method类的对象,这个对象表示的是一个java(Date)的一个方法.


               至此我们可以总结出,通过Class类我们可以操控java各种类的属性和方法,也就是说Class是反射的根基或起源.理解Class类是理解反射的第一步,在接下来的文章中我会通过一个实例来继续介绍java的反射机制.


  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/baoendemao/p/3804805.html
Copyright © 2011-2022 走看看