Java反射机制
通过Java反射机制,可以访问已经装载在JVM中的Java对象,实现访问、检测和修改Java对象,Java反射机制对于任意一个Jva对象,都能够调用它的任意一个方法和属性,这种动态 获取的信息以及动态调用对象的方法的功能。首先准备一个类,然后再通过反射来反射里面的信息。
准备的类:
public class ReflectClass {
private int int1;
private int int2;
//无参构造器
public ReflectClass() {
}
//有参构造器
public ReflectClass(int int1, int int2) {
this.int1 = int1;
this.int2 = int2;
}
//公有的方法
public int getInt1() {
return int1;
}
//公有的方法
public int getInt2() {
return int2;
}
//私有有的方法
private void setInt1(int int1){
this.int1 = int1;
}
//私有有的方法
private void setInt2(int int2){
this.int2 = int2;
}
}
1、通过反射获取和调用构造方法:
// 加载类
Class<?> class1 = ReflectClass.class;
// 获取构造器
//getConstructors()只能获取公有的构造器 getDeclaredConstructors();能获取所有的构造器
Constructor<?>[] constructors = class1.getDeclaredConstructors();//
System.out.println("构造器有:");
for (Constructor<?> constructor : constructors) {
StringBuilder builder =new StringBuilder();
builder.append("\t" + Modifier.toString(constructor.getModifiers()));
//名称
builder.append(" " + constructor.getName().substring(constructor.getName()
.lastIndexOf(".")+1) + "(");
//形参列表类型
Class<?>[] rarameterTypes=constructor.getParameterTypes();
for (Class<?> rarameterType : rarameterTypes) {
builder.append(rarameterType.getSimpleName() + ",");
}
builder.append(")");
String str = builder.toString();
str = str.replace(",)", ")");
System.out.println(str);//输出
}
// 通过反射调用构造器
System.out.println("----通过反射调用构造器赋值----");
Constructor<?> constructor=class1.getConstructor(int.class, int.class);
ReflectClass reflectClass = (ReflectClass) constructor.newInstance(12,22);
System.out.println("int1="+reflectClass.getInt1()+",int2="+reflectClass.getInt2());
获取结果:
2、通过反射获取和调用方法:
//通过反射获取方法
System.out.println("方法有:");
Method[] allMethods = class1.getDeclaredMethods();
for (int i = 0; i < allMethods.length; i++) {
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("\t");
sBuffer.append(i + 1);
sBuffer.append(":");
// 获取修饰符
sBuffer.append(Modifier.toString(allMethods[i].getModifiers())+" ");
// 获取返回值类型
sBuffer.append(allMethods[i].getReturnType().getSimpleName()+" ");
//获取方法名称
sBuffer.append(allMethods[i].getName());
sBuffer.append(" (");
//获取参数类型
Class<?>[] ptypes = allMethods[i].getParameterTypes();
for (int j = 0; j < ptypes.length; j++) {
sBuffer.append(ptypes[j].getSimpleName());
if(j+1 != ptypes.length){
sBuffer.append(" ");
}
}
sBuffer.append(")");
System.out.println(sBuffer.toString());
}
//通过反射调用方法
System.out.println("---通过反射调用方法获取值----");
Method method2=class1.getDeclaredMethod("getInt1");
method2.setAccessible(true);
System.out.println(method2.invoke(reflectClass));
获取结果:
3、通过反射获取和调用成员变量
// 获取所有的成员变量
System.out.println("所有的成员变量");
Field[] fields=class1.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
StringBuffer sBuffer= new StringBuffer();
sBuffer.append("\t");
sBuffer.append(i + 1);
sBuffer.append(":");
sBuffer.append(Modifier.toString(fields[i].getModifiers()));
sBuffer.append(" ");
sBuffer.append(fields[i].getType().getSimpleName());
sBuffer.append(" ");
sBuffer.append(fields[i].getName());
System.out.println(sBuffer.toString());
}
//通过反射调用成员变量
System.out.println("---通过反射调用成员变量获取值----");
Field field = class1.getDeclaredField("int1");
field.setAccessible(true);
System.out.println(field.get(reflectClass));
获取结果: