Java 反射
什么是反射
反射就是把java类中的各种成分映射成一个个的Java对象。
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射类的构造以及获取相关信息
package demo1;
import java.io.Serializable;
public class Person implements Serializable {
public String name;
private int age;
public Person(){
this.name = "Default";
this.age = -1;
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
private void action(String act){
System.out.println(act);
}
}
构造
有两种构造方式,一种是使用Class对象的newInstance方法,这种方法只能无参构造
Person p = new Person("FlowerYang", 20);
Class c = p.getClass();
c.newInstance();
另一种方法是先生成一个Constructor
再构造,这种方法可以带参数
Person p = new Person("FlowerYang", 20);
Class c = p.getClass();
Constructor con = c.getConstructor(String.class, int.class);
Person p1 = (Person)con.newInstance("P3ngu1nW", 20);
获取属性信息
使用getFields
来获取public属性的信息,getDeclaredFields
来获取所有属性的信息
通过getField
及getDeclaredField
来获取单个属性的信息
要获取某个对象的某个属性的值,需使用get
方法,对于private
的属性需setAccessible(true)
Field[] F = c.getDeclaredFields();
for (Field f:F){
f.setAccessible(true);
System.out.println(f.get(p1));
}
修改属性信息
Field namefield = c.getField("name");
namefield.set(p1, "FlowerYang");
Field agefield = c.getDeclaredField("age");
agefield.setAccessible(true);
agefield.set(p1, 18);
通过set方法,注意对于private
的属性需setAccessible(true)
获取属性方法
和获取属性信息的做法类似
Method[] M = c.getMethods();
for (Method m:M){
System.out.println(m);
}
调用属性方法
类似构造的方法
Method m = c.getDeclaredMethod("action", String.class);
m.setAccessible(true);
m.invoke(p1, "Hello World!");