一、获取Class对象的三种方式
public static void main(String[] args) throws ClassNotFoundException {
//第一种
Class clazz1 = Class.forName("com.lym.bean.Person");
//第二种
Class clazz2 = Person.class;
//第三种
Person p = new Person();
Class clazz3 = p.getClass();
}
二、通过配置文件获取类名并通过无参构造创建类的实例(形如第一种方式)
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("config.properties"));
Class clazz = Class.forName(br.readLine()); //获取该类的字节码文件
Person f = (Person) clazz.newInstance(); //创建实例对象
}
三、通过有参构造创建类的实例
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //获取有参构造
Person p = (Person) c.newInstance("张三",23); //通过有参构造创建对象
System.out.println(p);
}
四、获取类中的指定字段
Class.getField(String)方法可以获取类中的指定字段(可见的)
如果是私有的可以用getDeclaedField("name")方法获取,然后调用setAccessible(true)设置访问权限,再通过set(obj, "李四")方法可以设置指定对象上该字段的值,调用get(obj)可以获取指定对象中该字段的值
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //获取有参构造
Person p = (Person) c.newInstance("张三",23); //通过有参构造创建对象
//Field f = clazz.getField("name"); //获取姓名字段
//f.set(p, "李四");
// 修改姓名的值
Field f = clazz.getDeclaredField("name"); //暴力反射获取字段
f.setAccessible(true); //去除私有权限
f.set(p, "李四");
System.out.println(p);
}
五、获取类中的指定方法
Class.getMethod(String,Class...) 和 Class.getDeclaredMethod(String,Class...)方法可以获取类中的指定方法,调用invoke(Object,Object...)可以调用该方法
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.lym.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class); //获取有参构造
Person p = (Person) c.newInstance("张三",23); //通过有参构造创建对象
Method m = clazz.getMethod("eat"); //获取eat方法
m.invoke(p);
Method m2 = clazz.getMethod("eat", int.class); //获取有参的eat方法
m2.invoke(p, 10);
}