反射日常中用的不是很多,一般都是用于框架或者抽象度很高的底层代码,是个动态加载,反射的思想是万物皆可对象。
反射的基本知识并不难,也不需要过多探究
反射用到的类主要是四种:java.lang.Class
、java.lang.reflect.Constructor
、java.lang.reflect.Field
、java.lang.reflect.Method
反射的基本使用:
public class ClassTest{
public void Test(){
//加载类,获取加载类的Class类的对象
Class cls = Class.forName(classfullpath);
//获取加载类的实例(返回的是Objecit类型),运行类型还是加载类的实例类型
Objecit o = cls.newInstance();
//获取加载类的方法对象
Method method = cls.getMethod(methodName);
//调用方法,参数是加载类的实例,如果是静态方法,o可为null
method.invoke(o);
//获取成员变量,参数是成员变量名的字符串类型
Field field = cls.getField("fieldName");
//获取成员变量的值,参数也是加载类的实例
field.get(o);
//获取构造方法,参数为构造器中的参数类型
Constructor constructor = cls.getConstructor();
}
}
下面看下这4个类常用的方法,源码多涉及本地方法,就不用看了:
类java.lang.Class
:
String getName()
:获取全类名
String getSimpleName()
:获取简易类名
Field[] getFields()
:获取所有公共属性,包括父类以上的属性
Field[] getDeclaredFields()
:获取本类所有属性
Method[] getMethods()
:获取所有公共方法,包括父类以上的方法
Method[] getDeclaredMethods()
:获取本类所有方法
Constructor[] getConstructors()
:获取所有公共构造方法,包括父类以上的方法
Constructor[] getDeclaredConstructors()
:获取本类所有构造方法
String getPacket()
:以Packet形式返回包信息
Class getSuperclass()
:获取父类信息
Class getInterfaces()
:获取接口信息
Annotation[] getAnnotations()
:获取注解信息
属性java.lang.reflect.Field
:
int getModifiers()
:返回修饰符的类型编号,1是public,2是private,4是protected,8是static,16是final,如果有多个修饰符,返回的时直接相加
Class getType()
:返回类型
String getName()
:返回属性名
setAccessible()
:忽视访问权限
方法java.lang.reflect.Method
:
int getModifiers()
:返回修饰符的类型编号
Class getReturnType()
:获取返回类型
String getName()
:返回方法名
Class[] getParameterTypes()
:获取参数类型数组
setAccessible()
:忽视访问权限
构造器java.lang.reflect.Constructor
int getModifiers()
:返回修饰符的类型编号
String getName()
:返回方法名
Class[] getParameterTypes()
:获取参数类型数组
setAccessible()
:忽视访问权限