今天看了一部电影,我和我的家乡,里面有四个故事,其中的《最后一课》让我感受很深,一个老人患脑梗后,只记得了自己在贫困农村当老师的故事,其中他帮助一个学生,找彩色画笔,画学生对未来学校的细节,非常打动人,虽然最后他没有帮助成功,但是最后学生还是看到了自己心中的学校,人们常说理想是奢侈了,他离人们的生活太远了,看了这个故事,我觉得不然,成为领袖是理想,成为一个科学家是理想,那如果是为了家乡出一份力,算不算理想呢,也算是理想,理想放到每个人身上是不同,只要是有意义的事都可以是理想
啰嗦时间结束,开始说说今天的主角,反射
反射,他是运行时处理程序的代码,可以非常灵活
看一段代码
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():调用方法