使用Java反射机制可以在运行时期检查Java类的信息,检查Java类的信息往往是你在使用Java反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容:
在你想检查一个类的信息之前,你首先需要获取类的Class对象。Java中的所有类型包括基本类型(int, long, float等等),即使是数组都有与之关联的Class类的对象。如果你在编译期知道一个类的名字的话,那么你可以使用如下的方式获取一个类的Class对象。
Class myObjectClass = MyObject.class; String className = "reflection.domain.ReflectionSimple"; Class clazz = Class.forName(className);在使用Class.forName()方法时,你必须提供一个类的全名,这个全名包括类所在的包的名字。
如果在调用Class.forName()方法时,没有在编译路径下(classpath)找到对应的类,那么将会抛出ClassNotFoundException。
String className = "reflection.domain.ReflectionSimple"; //Class对象 Class clazz = Class.forName(className); System.out.println(clazz.toString()); //父类 Class superClazz = clazz.getSuperclass(); System.out.println(superClazz.toString()); //实现的接口 Class[] interfaces = clazz.getInterfaces(); //构造器 Constructor[] constructors = clazz.getConstructors(); //方法 Method[] methods = clazz.getMethods(); //变量 Field[] fields = clazz.getFields(); System.out.println(fields.length); //注解 Annotation[] annotations = clazz.getAnnotations(); System.out.println(annotations.length); Field field = clazz.getField("day"); System.out.println("field.getName() = " + field.getName());利用Java的反射机制你可以检查一个类的构造方法,并且可以在运行期创建一个对象。这些功能都是通过java.lang.reflect.Constructor这个类实现的。
//获取Constructor对象 Constructor constructor = ReflectionSimple.class.getConstructor(); ReflectionSimple reflection = (ReflectionSimple)constructor.newInstance(); System.out.println(JSON.toJSONString(reflection)); //构造方法参数 Class[] methodParameterTypes = constructor.getParameterTypes(); System.out.println(JSON.toJSONString(methodParameterTypes)); Class clazz = ReflectionSimple.class; //类的方法数组 Method[] methods = clazz.getMethods(); System.out.println(JSON.toJSONString(methods)); //获取指定方法 Method method = clazz.getMethod("getDate"); System.out.println(method); //方法参数 Class[] parameterTypes = method.getParameterTypes(); System.out.println(JSON.toJSONString(parameterTypes)); //方法返回值 Class returnType = method.getReturnType(); System.out.println(returnType);可以通过Class对象获取Field对象
String className = "reflection.domain.ReflectionSimple"; Class clazz = Class.forName(className); Field[] fields = clazz.getFields(); System.out.println(fields.length); Annotation[] annotations = clazz.getAnnotations(); System.out.println(annotations.length); Field field = clazz.getField("day"); System.out.println("field.getName() = " + field.getName());使用Java反射你可以在运行期检查一个方法的信息以及在运行期调用这个方法,通过使用java.lang.reflect.Method类就可以实现上述功能。
Constructor constructor = ReflectionSimple.class.getConstructor(); ReflectionSimple reflection = (ReflectionSimple)constructor.newInstance(); System.out.println(JSON.toJSONString(reflection)); //构造函数的参数 Class[] methodParameterTypes = constructor.getParameterTypes(); System.out.println(JSON.toJSONString(methodParameterTypes)); Class clazz = ReflectionSimple.class; //方法数组 Method[] methods = clazz.getMethods(); System.out.println(JSON.toJSONString(methods)); //获取指定方法 Method method = clazz.getMethod("getDate"); System.out.println(method); //方法参数 Class[] parameterTypes = method.getParameterTypes(); System.out.println(JSON.toJSONString(parameterTypes)); //方法返回类型 Class returnType = method.getReturnType(); System.out.println(returnType);备注:文章参考
Java反射指南
Java Reflection: Classes
Java Reflection: 构造器
Java Reflection: 变量
Java Reflection: 方法