上篇文章简单给了个反射的例子,主要利用反射列出了某个类的内部类、方法和属性,接下来我们举例反射的另一些用法。
首先看一个TestReflection.java类:
package com.xingpd.code;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Scanner;
public class TestReflection {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String className = sc.next();
Class clazz = Class.forName(className);
/** 创建对象 **/
/** 调用无参构造创建对象 **/
Object obj = clazz.newInstance();
System.out.println(obj);
/** 操作属性 **/
Field field = clazz.getDeclaredField("name");
/** 破坏封装 **/
field.setAccessible(true);
System.out.println(field.get(obj));
field.set(obj, "zhangfei");
Object fieldValue = field.get(obj);
System.out.println(fieldValue);
/** 操作方法 **/
Method method = clazz.getDeclaredMethod("setName", String.class);
/** 等价于obj.setName("liubei"); **/
method.invoke(obj, "liubei");
method = clazz.getDeclaredMethod("getName");
Object returnValue = method.invoke(obj);
System.out.println(returnValue);
Method method2 = clazz.getDeclaredMethod("test", String.class,
int.class);
/** 获取方法的修饰符 **/
int i = method2.getModifiers();
System.out.print(Modifier.toString(i) + " ");
/** 获取方法的返回类型 **/
Class c = method2.getReturnType();
System.out.print(c.getName() + " ");
/** 获取方法名 **/
System.out.print(method2.getName() + "(");
/** 获取参数列表 **/
Class[] cs = method2.getParameterTypes();
System.out.print(Arrays.toString(cs));
System.out.print(")");
}
}
在运行以后,控制台输入:com.xingpd.code.MyUser 按回车,效果如下:
MyUser类(存在于com.xingpd.code包里边):
class MyUser {
private String name = "guanyu";
private int age = 25;
public final String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public MyUser(String name, int age) {
super();
this.name = name;
this.age = age;
}
public MyUser() {
super();
}
public void test(String str, int i) throws Exception {
}
}
反射当中,Field是属性类,它生成的对象就是某个指定类的某个属性;
Method是方法类,它生成的对象就是指定的某个类的某个方法。
method.invoke()方法的意思就是相当于引用、借助于原类的那个方法,他们的作用相同,比如说原类有一个方法叫getName(),那么通过反射拿到的method对象:
Method method = clazz.getDeclaredMethod("getName");
Object returnValue = method.invoke(obj);
这里returnValue就是getName所返回的对象,所以说反射拿到的方法和原方法一样的功能调用。