zoukankan      html  css  js  c++  java
  • 反射

    reflection,获取正在运行的对象,动态获取类的信息以及动态调用一个对象的方法的机制叫做反射。 

    功能优点
     在运行时判断任意一个对象所属的类;
     在运行时判断一个类所具有的属性和方法;
     在运行时构造一个类的对象;

     在运行时调用一个对象的方法;
     生成动态代理;

    实现过程
     加载一个类;
     根据这个类动态创建一个对象;
     动态得到这个对象的方法;
     调用这个对象的方法;


    反射 - C#

    命名空间:using System.Reflection;

    元数据

    metedata,有关程序及其类型的数据信息,描述数据(类型)的数据,保存在程序的程序集中。

    Type 类

     抽象类,命名空间 using System; 用于包含类型的特性信息、访问元数据的主要方式。运行时,CLR 创建 Type 类的子类的实例,但是 CLR 返回 Type 类的引用(指向子类的实例)。程序中的每一个类型都会对应一个独立的 Type 类的对象,用于反射数据。
    · 属性方法

    NameSpace/Name:命名空间/类型名 
    FullName:类型的完全限定名 
    BaseType:直接基本类型 
    GetField/GetFields():字段列表 
    GetProperty/GetProperties():属性列表 
    GetMethod/GetMethods():方法列表 

    · 类型获取的几种方法:

    typeof 运算符:typeof(类型名); 
    对象调用 GetType() 方法:obj.GetType(); 
    Type 类的静态方法 GetType():Type.GetType("类型名");

    特性

    Attribute,允许向程序的程序集中添加元数据的机制。描述数据的元数据。
    ζ Attribute 类在 编译 时实例化;
    ζ 所有特性名称以 "Attribute" 结束,在代码中使用特性时,不需指定 Attribute 后缀;
    ζ 应用了特性的元素叫做目标 (target);
    ζ 参数:位置参数 (必须) Positional Parameters,命名参数 (可选) Named Parameters;
    特性的目的是允许编译器把程序结构的某些元数据嵌入到程序集中。从 .Net 角度看,特性是类,继承于 System.Attribute 类再之 System.Object类,对程序中的类、方法、字段、属性等 元素 进行标注和描述,主要用在反射中。具体:
    Obsolete:将元素标记为过期的、不再使用的并且在代码编译时显示警告信息。
    Conditional:条件编译作用,以编译符号是否定义决定是否包括某个特定方法的所有调用。
    Serializable:声明元素可以被序列化。
    也可显式标注特性,将其应用到特定元素:程序集assembly、模块module、方法、返回值等。特性 Serializable、AttributeUsage 和 ComVisible 可以用于描述特性,是 "元数据的元数据" (元元数据:meta-metadata)。
    自定义特性
    · 任何公共的读写字段或属性都是命名参数,构造函数中的参数是特性中的位置参数;
    · AttributeUsage 描述特性的使用方式,AttributeTargets 指定特性应用到哪些元素;
    · 普通类的构造函数是命令式语句,特性的构造函数是声明式语句;

    [AttributeUsage(AttributeTargets.Xxx|AttributeTargets.Xxx, AllowMultiple=true, Inherited=false)]
    public sealed class MyAttAttribute : System.Attribute {
       // 字段 属性 构造函数(可重载)
    }

    利用反射访问特性
    · IsDefined()
       利用 Type 对象的 IsDefined 方法检测某个特性是否应用到了某个类上。
       bool isDefined = objType.IsDefined(typeof(MyAttAttribute), false);
    · GetCustomAttributes()
       返回应用到结构的特性的数组。返回类型为 object,使用时需要强制转换。
       object[] attArr = objType.GetCustomAttributes(false);

    public abstract bool IsDefined(Type attributeType, bool inherit);
    public abstract object[] GetCustomAttributes(bool inherit);
    public abstract object[] GetCustomAttributes(Type attributeType, bool inherit);

    反射

    参考


    反射 - Java

    • Class: 表示正在运行的Java应用程序中的类和接口;  
    • Field: 提供有关类或接口的属性信息以及对它的动态访问权限;  
    • Constructor: 提供关于类的单个构造方法的信息以及对它的访问权限;
    • Method: 提供关于类或接口中某个方法信息;

     其中,Class类是Java反射中最重要的一个功能类,所有获取对象的信息(方法/属性/构造方法/访问权限)都需要它来实现:

    参考
    [1]. ;


    参考
    · 反射 - C# 和 Java

  • 相关阅读:
    Python学习之路2☞数据类型与变量
    Python学习之路1☞简介及入门代码
    OpenStack组件系列☞horizon搭建
    39
    38
    37
    36
    35
    33
    32
  • 原文地址:https://www.cnblogs.com/wjcx-sqh/p/5929882.html
Copyright © 2011-2022 走看看