• 57 什么是反射?


    什么是反射?

    答:

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

    Class类

    这个类用于操纵(反向解析)一个类的属性,方法,构造器等。

    Person: name,age,address(Class只要知道你这个Person类,那么它便可知道你所有的属性,不止属性,甚至方法上的注解等等,都会知道。)
     

    范例:获取一个Class对象

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Arrays;
     
    public class Test01 {
        public static void main(String[] args) throws ClassNotFoundException {
            String a = "java.lang.String";
    //        String a = "java.lang.HashMap";
     
            // 根据一类的全名字符串来获得一个类的类对象
            Class<?> clazz = Class.forName(a);
            // 获得传递过来的类的所有方法
            Method[] methods = clazz.getDeclaredMethods();
    //        String s = Arrays.toString(methods);
            for (Method m: methods) {
                System.out.println(m);
            }
            System.out.println("------------------------------------------");
            // 获得类的所有属性
            Field[] declaredFields = clazz.getDeclaredFields();
            for(Field d : declaredFields) {
                System.out.println(d);
            }
            System.out.println("-------------------------------------");
            // 获得类的所有构造器
            Constructor<?>[] constructors = clazz.getDeclaredConstructors();
            for (Constructor c : constructors) {
                System.out.println(c);
            }
        }
    }
    

     

    原文链接: https://blog.csdn.net/qq_36957885/article/details/89599470 (上文)
    原文链接: https://www.baidu.com/link?url=C1M9BNybEDSzThitXE2RU0aPVTFgV7Gf8p3cqzrFRN_K_BqB04igQV1SEqxfnDcZBwkYfgwA1MDDqB7tQ5AKsa&wd=&eqid=8c09ec9c0023660c000000065ec08fa4 (下文的一小部分)
     

    拓展

    什么是反射,反射能干嘛?

    • 反射是:指程序可以访问、检测和修改它本身状态或行为的一种能力

    我们平时用反射主要做:

    • 获取类型的相关信息

    • 动态调用方法

    • 动态构造对象

    • 从程序集中获得类型。

    我们获取已加载程序集中类型的Type对象的几种方法:(以StringBuilder 类型为例)

    • 直接使用typeof操作符 Type T1 = typeof(StringBuilder);

    • 通过类型实例 Type T2 = new StringBuilder().GetType();

    • 通过Type类的静态方法 Type T3 = Type.GetType("System.IO.Stream");

    获取类型本身信息(命名空间名、全名、是否是抽象、是否是类、、、等等)

    var T1 = typeof(StringBuilder);                      
    Console.WriteLine("命名空间名称:" + T1.Namespace);
    Console.WriteLine("直接基类型:" + T1.BaseType);
    Console.WriteLine("全名:" + T1.FullName);
    Console.WriteLine("是抽象类型:" + T1.IsAbstract);
    Console.WriteLine("是类:" + T1.IsClass);
    //.....等等
    


     

    获取类型成员信息(通过Tyep中的方法GetMembers)

    var Mets = T1.GetMembers();//获取Type对象的所有公有成员           
    foreach (var m in Mets)
    {
        Console.WriteLine("【" + m.MemberType.ToString()+ "】:" + m.Name);
        // m.MemberType 是成员类型
    }
    


     

  • 相关阅读:
    Go语言从入门到放弃(三) 布尔/数字/格式化输出
    11. GLOBAL_VARIABLES 与 SESSION_VARIABLES
    10. GLOBAL_STATUS 与 SESSION_STATUS
    9. FILES
    8. EVENTS
    7. ENGINES
    6. COLUMN_PRIVILEGES
    5. COLUMNS
    4. COLLATION_CHARACTER_SET_APPLICABILITY
    3. COLLATIONS
  • 原文地址:https://www.cnblogs.com/ynzj123/p/12903971.html
Copyright © 2020-2023  润新知