反射

87 阅读3分钟

今天看了一部电影,我和我的家乡,里面有四个故事,其中的《最后一课》让我感受很深,一个老人患脑梗后,只记得了自己在贫困农村当老师的故事,其中他帮助一个学生,找彩色画笔,画学生对未来学校的细节,非常打动人,虽然最后他没有帮助成功,但是最后学生还是看到了自己心中的学校,人们常说理想是奢侈了,他离人们的生活太远了,看了这个故事,我觉得不然,成为领袖是理想,成为一个科学家是理想,那如果是为了家乡出一份力,算不算理想呢,也算是理想,理想放到每个人身上是不同,只要是有意义的事都可以是理想

啰嗦时间结束,开始说说今天的主角,反射

反射,他是运行时处理程序的代码,可以非常灵活

看一段代码

Class clazz = UserApi.class;
//获取类中的方法
Method queryUserInfo = clazz.getMethod("queryUserInfo");
//通过方法调用类来返回结果 正常来说应是通过类调用方法的编码方式
Object invoke = queryUserInfo.invoke(clazz.newInstance());
System.out.println(invoke);

这是反射使用的实例,下面从几个方面来阐述

1 反射的优劣处

好处就是非常灵活,只要知道了类名就可以调用里面的方法,可以弄很多灵活的设计,有较高的可拓展性,比如打印等

坏处就是因为他是动态解析的,所以就无法执行一些JVM虚拟机的优化,增大了开销,并且还有安全的限制

2 反射有那些Api

1)Class类

Class.getSuperclass()

Class.getClasses() 返回作为类成员的所有公共类,接口和枚举,包括继承的成员。

Class.getDeclaredClasses() 返回在此类中显式声明的所有类接口和枚举。

Class.getDeclaringClass() 返回在此类成员变量声明的类,匿名类没有DeclaringClass,但是有EnclosingClass

java.lang.reflect.Field.getDeclaringClass()

java.lang.reflect.Method.getDeclaringClass()

java.lang.reflect.Constructor.getDeclaringClass()

Class.getEnclosingClass() 返回类的直接封闭类。

2)Field类

获取字段类型

Field.getType():获取字段的类型

Field.getGenericType():获取字段的泛型类型

检索和解析字段修饰符

Field.getModifiers():获取字段修饰符

Field.isSynthetic():判断字段是否为合成的

Field.isEnumConstant():判断字段是否为枚举

获取和设置字段值

Field.set*() :获取字段值

Field.get*() :设置字段值

3)Method类

获取方法类型信息

Method.toGenericString()

Method.getReturnType()

Method.getGenericReturnType()

Method.getParameterTypes()

Method.getGenericParameterTypes()

Method.getExceptionTypes()

Method.getGenericExceptionTypes()

获取方法参数的名字

Method.getParameters():获取方法参数

Parameter.getType():获取参数类型

Parameter.getName():获取参数名称

Parameter.Modifiers():获取参数修饰符

Parameter.isImplicit():true如果在源代码中隐式声明此参数

Parameter.isNamePresent():true如果参数根据.class文件具有名称

Parameter.isSynthetic():true如果在源代码中既未隐式声明也未显式声明此参数

检索和解析方法修饰符

Method.getModifiers():获取方法修饰符

Method.isSynthetic():返回true此可执行文件是否为合成构造

Method.isVarArgs():返回true如果这个可执行文件被宣布为带有可变数量的参数

Method.isBridge():true如果此方法是桥接方法

调用方法 Method.invoke():调用方法