一,反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。
二,反射机制的作用:
1,反编译:.class-->.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。
三,Java提供反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
获取类内信息
获取内容 | 方法签名 |
---|---|
构造器 | Constructor<T> getConstructor(Class<?>... parameterTypes) |
包含的方法 | Method getMethod(String name, Class<?>... parameterTypes) |
包含的属性 | Field getField(String name) |
包含的Annotation | <A extends Annotation> A getAnnotation(Class<A> annotationClass) |
内部类 | Class<?>[] getDeclaredClasses() |
外部类 | Class<?> getDeclaringClass() |
所实现的接口 | Class<?>[] getInterfaces() |
修饰符 | int getModifiers() |
所在包 | Package getPackage() |
类名 | String getName() |
简称 | String getSimpleName() |
一些判断类本身信息的方法
判断内容 | 方法签名 |
---|---|
注解类型? | boolean isAnnotation() |
使用了该Annotation 修饰? | boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) |
匿名类? | boolean isAnonymousClass() |
数组? | boolean isArray() |
枚举? | boolean isEnum() |
原始类型? | boolean isPrimitive() |
接口? | boolean isInterface() |
obj 是否是该Class 的实例 | boolean isInstance(Object obj) |
四、反射对象获取
Class class1 = 类名.class;//第一种
Class class2 = Class.forName("类名");//第二种
Class class3 = new 类名().getClass();//第三种
Object object = class1.newInstance();//实例化
五、修改字段的值
1.先得到field,
Field field=clazz.getDeclaredField("name");
2.将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
field.setAccessible(true);
3.对变量值进行修改
field.set(employee,"张三");
要访问私有的方法也是一样。
用getDeclaredFields就能得到private 和public protend protected 的字段如果用c.getFields();只能得到public类型的属性