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 是成员类型
}


 

原文地址:https://www.cnblogs.com/ynzj123/p/12903971.html