什么是反射
- 程序运行时,对一个类的class文件,进行解剖,获得成员方法,成员变量,构造方法, 运行这些方法
- 反射的目的,增强程序的扩展性
获得class文件,class是一个对象
有三种方法获取class文件对象
- 通过对象获得getClass()
- 通过类的静态属性获得class
- 通过Class类的静态方法获得classByName(String name)
第一种:对象.getClass()
第二种:类.class()
第三种:Class.ByName()
获取了Class文件对象后,就需要使用它
- 获取构造方法
getConstructors()返回数组,所有的公共的
getDeclaredConstructors()返回数组,所有的,包含私有的
import java.lang.reflect.Constructor;
public class Demo {
public static void main(String[] args) {
//得到所有的构造函数,不包括私有
Constructor[] p = new Person().getClass().getConstructors();
for(Constructor con: p) {
System.out.println(con);
}
//得到所有的构造函数,包括私有
Constructor[] p = Class.forName("Person").getDeclaredConstructors();
for(Constructor con: p) {
System.out.println(con);
}
}
}
class Person {
private String name = "";
public int age;
public Person() {
System.out.println("无参构造函数");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造函数");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 创建对象,用newInstance()
public class Demo {
public static void main(String[] args) throws Exception {
Person person = Class.forName("Person").newInstance();
System.out.println(perosn.getName());
}
}
class Person {
private String name = "";
public int age;
public Person() {
System.out.println("无参构造函数");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造函数");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 获取成员属性
getFields()获取所有的成员变量,返回数组,只是公有的
getDecalredFields()获取所有的成员属性,包括私有的
使用Field类中的方法set()修改成员变量的值
import java.lang.reflect.Field;
public class Demo {
public static void main(String[] args) throws Exception {
Field[] field = Class.forName("Person").getFields();
for(Field fd: field) {
System.out.println(fd);
}
Field[] field2 = Class.forName("Person").getDeclaredFields();
for(Field fd: field2) {
System.out.println(fd);
}
}
}
- 获取成员方法,并运行
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class Demo {
public static void main(String[] args) throws Exception {
//返回所有方法,包括继承的、公有的
//Method[] method = Class.forName("Person").getMethods();
//返回所有的方法,包括公有的、私有的,不包括继承的
//Method[] method = Class.forName("Person").getDelaredMethods();
Class clazz = Class.forName("Person");
Constructor con = clazz.getConstructor(String.class,int.class);
Object person = con.newInstance("ok",24);
Method get = clazz.getMethod("getName");
Method set = clazz.getMethod("setName",String.class);
System.out.println(get.invoke(person));
System.out.println(set.invoke(person,"ok-change"));
System.out.println(get.invoke(person));
}
}
class Person {
private String name = "";
public int age;
public Person() {
System.out.println("无参构造函数");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造函数");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}