本文是个人的学习笔记,仅供参考,如有问题,欢迎私信指出!
PS:本人更新进度较慢,未完结的文章会在标题注明,完结后也会在标题注明。
反射(Reflection)是Java 高级编程必备的一个概念,本文针对Java初学者,对反射做一个简单的介绍。
1.反射的作用
反射在Java中通常应用于JavaBeans和Android开发中,其主要作用是分析类的能力。使用反射机制,可以:
在程序运行过程中对类的能力和构造进行分析。
在运行中查看某一类的方法,供所有类使用(invoke方法)。
实现一个可以包含多个数据类型的数组或者集合。
2.反射的基础——Class类
Class类是类(class)的抽象,任何一个class都是Class类的一个对象。这一对象被称为该类的类类型。Java中,获取一个class的类类型通常有以下三种方法:
Class c1 = Object.class;
Class c2 = object.getClass();
Class c3 = Class.forName("Object");
三种方法都可以获取某一类的class类对象,值得一提的是,每一个类的class类对象是唯一的。也就是说,下列代码:
System.out.println(c1==c2);
System.out.println(c2==c3);
执行后打印的值均为true.
在获取到class对象后,常用newInstance()方法去构造一个该类的类对象,而不是调用类本身的构造方法。
3.反射对类结构的分析功能
在获得某个类的类类型后,通过反射机制可以对该类的结构进行分析。一个类主要包括三个部分:
(1)方法信息:包括类中所有方法的返回值,权限修饰符,方法名,参数类型。
(2)成员变量信息:包括类中所有成员变量的权限修饰符,变量类型,变量名。
(3)构造信息:包括类中所有的构造方法。
下面分三小节简述下或者三个部分信息的主要方法:
3.1 获取类的方法信息
在java.lang.reflect包中,Method类主要负责处理和方法有关的操作。一个Method对象表示一个方法。因此,要获取一个类的所有方法信息,首先需要将类中的所有方法转换为Method对象就行处理。在class类中,提供了两个方法供使用:
Class c = Class.forName("classname");
Method[] methods = c.getMethods();
Method[] declaredMethods = c.getDeclaredMethods();
其中,getMethods()方法是获取类中所有public方法(包括从父类和接口中继承的方法),getDeclaredMethods()方法是获取类中所有自己声明的方法(不包括继承方法)。
接下来遍历Method数组,获取每个方法的信息。详细方法如下
public void printMethodMessage(Object object) {
Class c = Class.forName(object);
Method[] methods = c.getMethods();
Method[] declaredMethods = c.getDeclaredMethods();
for(Method m:methods) {
Class returnType = m.getReturnType();//获取返回值的类类型
String name = m.getName(); //获取方法名
Parameter[] parameters = m.getParameters(); //获取参数
String methodInfo = returnType.getName() + " " + name + " (";//将方法信息整理成字符串
for(Parameter pm:parameters) {
methodInfo += pm.getParameterizedType().getTypeName() + " " + pm.getName() + ",";
}
methodInfo += ")";
System.out.println(methodInfo);//控制台输出方法信息
}
}
3.2获取类的成员变量信息
在java.lang.reflect包中,Field类负责变量的表示和操作。一个Field对象表示一个变量。与获取方法信息思路相同,如果要获取一个类的所有成员变量信息,将类中所有成员变量转换为Field对象进行处理。class类同样提供了两个方法获取类中的Field对象。
<span style="font-size:12px;">Class c = Class.forName("classname");
Field[] fields = c.getFields();
Field[] declaredFields = c.getDeclaredFields();</span>
与getMethods()和getDeclaredMethods()相类似,getFields()获取类中所有public成员变量,包括继承;getDeclaredFields()获取类中所有自己声明的成员变量,不包括继承。
获取成员变量信息的详细代码如下
public static void printVariableMessage(Object object) {
Class c = object.getClass();
Field[] fields = c.getDeclaredFields();
for(Field f:fields) {
System.out.println(f.getType().getName() + " " + f.getName());
}
}
3.3获取类的构造方法信息
在java.lang.reflect包中,Constructor类专门处理构造方法。(构造方法不用Method处理)。class类提供一个方法获取类中的所有构造方法。
<span style="font-size:12px;">Class c = Class.forName("classname");
Constructor[] cons = c.getConstructors();</span>
剩余的部分参考3.1,但请注意,构造方法不存在返回值!
(PS:第一部分已完结,后续内容会在3-4天后继续更新)