什么是反射?
答:
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 是成员类型
}