java语言提供了一些内置的api,可以在运行时获取class的信息,本篇文章为基础的入门教程之一,目的是让大家对反射 (reflect)的api有一些了解,后续会提供更多更详细的文章去深入了解反射的api。看一个很简单的例子:
首先编写一个很简单的Class
public class ClassInfo {
private String field01;
private int field02;
public ClassInfo() {}
public ClassInfo(String field01, int field02) {
this.field01 = field01;
this.field02 = field02;
}
public String getField01() {
return field01;
}
public void setField01(String field01) {
this.field01 = field01;
}
public int getField02() {
return field02;
}
public void setField02(int field02) {
this.field02 = field02;
}
public String show() {
return field01 + "---" + field02;
}
}
然后看看反射api的基本工作方法:
package temp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
public static void main(String[] args) {
// 获取Class定义的字段名称。
Field[] fields = ClassInfo.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("fields[" + i + "]:" + fields[i].getName());
}
// 获取Class定义的构造函数信息
Constructor[] constructors = ClassInfo.class.getDeclaredConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor constructor = constructors[i];
String show = "constructors[" + i + "]:" + ClassInfo.class.getName() + "(";
Class[] parameters = constructor.getParameterTypes();
if (parameters.length > 0) {
for (int j = 0; j < parameters.length; j++) {
show += parameters[j].getName() + " arg" + j + ",";
}
show = show.substring(0, show.length() - 1);
}
show += ")";
System.out.println(show);
}
// 获取Class定义的方法信息
Method[] methods = ClassInfo.class.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
Class c = method.getReturnType();
String show = "methods[" + i + "]: " + c.getName() + " " + method.getName() + "(";
Class[] parameters = method.getParameterTypes();
if (parameters.length > 0) {
for (int j = 0; j < parameters.length; j++) {
show += parameters[j].getName() + " arg" + j + ",";
}
show = show.substring(0, show.length() - 1);
}
show += ")";
System.out.println(show);
}
}
}
运行这个Class将会看到通过反射方式获取的ClassInfo这个class的信息。当然这是比较简单的演示,为的是让大家对反射有个基本的了解。获取信息都使用的是getDeclared开头的方法,表示只要在类中定义的信息,不要通过继承获取的信息。本篇文章就到这里了,深入的信息在以后的文章里面继续讨论。
首先编写一个很简单的Class
public class ClassInfo {
private String field01;
private int field02;
public ClassInfo() {}
public ClassInfo(String field01, int field02) {
this.field01 = field01;
this.field02 = field02;
}
public String getField01() {
return field01;
}
public void setField01(String field01) {
this.field01 = field01;
}
public int getField02() {
return field02;
}
public void setField02(int field02) {
this.field02 = field02;
}
public String show() {
return field01 + "---" + field02;
}
}
然后看看反射api的基本工作方法:
package temp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
public static void main(String[] args) {
// 获取Class定义的字段名称。
Field[] fields = ClassInfo.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.println("fields[" + i + "]:" + fields[i].getName());
}
// 获取Class定义的构造函数信息
Constructor[] constructors = ClassInfo.class.getDeclaredConstructors();
for (int i = 0; i < constructors.length; i++) {
Constructor constructor = constructors[i];
String show = "constructors[" + i + "]:" + ClassInfo.class.getName() + "(";
Class[] parameters = constructor.getParameterTypes();
if (parameters.length > 0) {
for (int j = 0; j < parameters.length; j++) {
show += parameters[j].getName() + " arg" + j + ",";
}
show = show.substring(0, show.length() - 1);
}
show += ")";
System.out.println(show);
}
// 获取Class定义的方法信息
Method[] methods = ClassInfo.class.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
Class c = method.getReturnType();
String show = "methods[" + i + "]: " + c.getName() + " " + method.getName() + "(";
Class[] parameters = method.getParameterTypes();
if (parameters.length > 0) {
for (int j = 0; j < parameters.length; j++) {
show += parameters[j].getName() + " arg" + j + ",";
}
show = show.substring(0, show.length() - 1);
}
show += ")";
System.out.println(show);
}
}
}
运行这个Class将会看到通过反射方式获取的ClassInfo这个class的信息。当然这是比较简单的演示,为的是让大家对反射有个基本的了解。获取信息都使用的是getDeclared开头的方法,表示只要在类中定义的信息,不要通过继承获取的信息。本篇文章就到这里了,深入的信息在以后的文章里面继续讨论。