zoukankan      html  css  js  c++  java
  • JAVA中反射机制一

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223

    反射一 基本概念

    一、反射机制的基本概念

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

    二、反射可以做什么

    我知道了反射的概念,那么反射可以做什么呢?

    1. 在运行时可以判断任意一个对象是否属于所属的类
    2. 在运行期可以构造任意一个对象
    3. 在运行期可以获取一个类的成员变量或者方法
    4. 在运行期可以去调用一个对象的方法

    三、反射的相关类

    在JDK 中,主要有以下类来实现JAVA反射机制,这些类(除了第一个)都位于java.lang.reflect包中

    Class类:代表一个类,位于java.lang包下。

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

    Method类:代表类的方法。

    Constructor类:代表类的构造方法。

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

    四、反射的基本原理

    要实现反射功能,那么需要经过加载类,和解析类两个步骤;所谓加载类,即将类的字节码加载到内存中去,然后去解析这个类,从而得到所要的属性或者方法。

    例如:用于反射的类,如Method,可以在java.lang.reflect包中找到。使用这些类的时候必须要遵循三个步骤:

    第一步:获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等。

    第二步:调用诸如getDeclaredMethods的方法,取得该类中定义的所有方法的列表。

    第三步:使用反射的API来操作这些信息。

    五、加载类,即获取Class对象的三种方式

    1.使用Class类的静态方法。例如:  

    Class.forName("java.lang.String");

    2.使用类的.class语法。如:

    String.class;

    3.使用对象的getClass()方法。如:

    String str = "aa";

    Class<?> classType1 = str.getClass();

    getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。

    直接print所获得的Class对象classType会输出:

    class 完整类名

    如果调用该Class对象的getName()方法,则输出完整类名,不加class。

    六、实例演示

    package study.reflect;
    
     
    
    public class Demo01
    
    {
    
        /**
    
         * 反射,加载类,获取类的字节码
    
         * @param args
    
         * @throws Exception
    
         */
    
        public static void main(String[] args) throws Exception
    
        {
    
           //1.
    
           Class<?> clazz = Class.forName("study.reflect.Person");
    
          
    
           //2.
    
           Class<?> clazz1 = new Person().getClass();
    
          
    
           //3.
    
           Class<?> clazz2 = Person.class;
    
          
    
           /**
    
            * 通过上面的三种方式,加载类已经完成,获取到了类的字节码,那么Class 提供了那些方法呢?
    
            * public Constructor<T> getConstructor(Class<?>... parameterTypes)
    
               public Method getMethod(String name,Class<?>... parameterTypes)
    
               public Field getField(String name)
    
            *
    
            * 也就说,和定义里面说的一样,我们可以拿到类的属性,方法 ,构造函数等相关的东西
    
            *
    
            *
    
            */
    
        }
    
     
    
    }

    七、思考,我们解剖出了这些成员后有什么用呢?

    提示:构造函数,创建对象;属性,用于保存数据;方法,可以执行某些功能。

  • 相关阅读:
    配置navigation bar外观
    加急审核
    UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
    打开某个好友的聊天界面
    ALAssets的两种用法
    更改appstore开发商名字
    回调函数的使用
    相应字体所占的位置大小
    IOS的变量前加extern和static字段
    iOS开发代码规范(通用)
  • 原文地址:https://www.cnblogs.com/pony1223/p/7445776.html
Copyright © 2011-2022 走看看