一、反射的获取功能
1.获取成员变量们
Field[] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称的public修饰的成员变量
Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
2.获取构造方法们
Constructor<?>[] getConstructors()
Constructor<?> getConstructor(类<?>...parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor<?> getDeclaredConstructor(类<?>...parameterTypes)
3.获取成员方法们
Method[] getMethods()
Method getMethod(String name,类<?>...parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,类<?>...parameterTypes)
4.获取类名
String getName()
二、使用方式
1.Constructor
创建对象:
*T newInstance(objext... initargs)
*如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
2.Method
*执行方法:
*object invoke(Object obj,Object... args)
*获取方法名称:
*String getName:获取方法名
3.Field
*操作
1.设置值
*set(Object obj,Object value)
2.获取值
*get(Object obj)
注意:
爆破:忽略访问权限修饰符的安全检查
*setAccessible(true):暴力反射,可以修改private修饰的变量
简单演示:
public class Person {//存放在Subject包中
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void eat(){
System.out.println("eating...");
}
public void eat(String food){
System.out.println("eating "+food+" ...");
}
public void run(){
System.out.println("running...");
}
}
public class ReflectTest {
public static void main(String[] args) throws Exception {
//1
// Class person = forName("cn.Subject.Person");
// Field[] fields = person.getDeclaredFields();
// Person person1 = new Person("张三",24);
// for(Field field : fields) {
// field.setAccessible(true);//爆破
// Object obj = field.get(person1);
// System.out.println(obj);
// }
//2
// Class person = Person.class;
Method method = person.getMethod("eat");
// Method method = person.getMethod("eat",String.class);
// Person person1 = new Person();
// method.invoke(person1,"rice");
//3
// Person person1 = new Person();
// Class person = person1.getClass();
// Constructor constructor = person.getConstructor();
// Object obj = constructor.newInstance();
// System.out.println(obj);
}
}