只知道类名,就可以得到类的属性,构造方法,方法,还可以创建对象
在配置文件中说明类名
增强可扩展性
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflect {
public static void main(String[] args) throws Exception {
getField();
getConstructor();
getMethod();
}
private static void getMethod() throws Exception {
String classname = "reclect.Person";
Class clazz = Class.forName(classname);//拿到字节码文件对象
String methodName = "show";
Method method = clazz.getMethod(methodName,String.class,int.class);
Person p = (Person)clazz.newInstance();
method.invoke(p,"bb",20);
}
private static void getConstructor() throws Exception {
String classname = "reclect.Person";
Class clazz = Class.forName(classname);//拿到字节码文件对象
//获取指定构造器
Constructor con = clazz.getConstructor(String.class,int.class);
//通过构造器对象初始化类对象
Person p = (Person)con.newInstance("aa",23);
System.out.println(p);
}
private static void getField() throws Exception {
String classname = "reclect.Person";
Class clazz = Class.forName(classname);
String fieldName = "name";
//getXXX:获取的都是类中共有的成员
//getDeclaredXXX:获取本类中已有的成员
Field field = clazz.getDeclaredField(fieldName);//获取已经声明过的字段,不论权限
Person p = (Person)clazz.newInstance();//获取对象
field.setAccessible(true);//忽略权限
field.set(p,"xx");
System.out.println(p);
}
}