一、反射機制的常見作用
1、動态加載類、動态擷取類的資訊(屬性,方法,構造器)。
2、動态構造對象。
3、動态調用類和對象的任意方法、構造器。
4、動态調用和處理屬性。
5、擷取泛型資訊。
6、處理注解。
二、bean.User類
javabean必須要有無參的構造器
public class User {
private int id;
private int age;
private String uname;
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
三、通過反射API擷取屬性、方法、構造器資訊
/**
* 應用反射的API擷取類的資訊(類的名字、屬性、方法、構造器)
* @author 鵬鵬
*
*/
@SuppressWarnings("all")
public class Demo03 {
public static void main(String[] args) throws NoSuchFieldException {
String path = "bean.User";
try {
Class c = Class.forName(path);
//擷取類的包名+名字
System.out.println(c.getName());
//隻擷取類名
System.out.println(c.getSimpleName());
//擷取屬性資訊
//Field[] fields = c.getFields(); //隻能擷取public修飾的屬性
//Field[] fields = c.getDeclaredFields() //擷取所有的屬性
Field[] fields = c.getDeclaredFields();
System.out.println(fields.length);
//擷取方法資訊
Method[] m = c.getDeclaredMethods(); //隻能擷取公開的方法
//Method method = c.getDeclaredMethod("getUname", null); //第二個參數是方法中參數的類型,區分重載的方法,同名不同參數
//Method method = c.getDeclaredMethod("setUname",String.class)
for(Method m1:m)
{
System.out.println(m1);
}
//擷取構造方法的資訊
Constructor[] cons = c.getConstructors();
Constructor[] cons2 = c.getDeclaredConstructors();
for(Constructor con:cons) {
System.out.println(con);
}
} catch (ClassNotFoundException | SecurityException e) {
e.printStackTrace();
}
四、通過反射API操作屬性、方法、構造器
/**
* 通過反射API動态操作:構造器、方法、屬性
* @author 鵬鵬
*
*/
@SuppressWarnings("all")
public class Demo04 {
public static void main(String[] args) {
String path = "bean.User";
try {
Class c = Class.forName(path);
//通過反射API動态操作構造器來構造對象
User user = (User)c.newInstance(); //調用了User的無參構造方法
System.out.println(user);
//調用有參數構造器
Constructor con = c.getDeclaredConstructor(int.class,int.class,String.class);
User user2= (User) con.newInstance(12,21,"pengpeng");
System.out.println(user2.getUname());
//通過反射API擷取普通方法
User user3 = (User) c.newInstance();
//下面的兩行==user3.setAge(23)
Method method = c.getDeclaredMethod("setUname", String.class);
method.invoke(user3, "pengpeng");
//通過反射API操作屬性
Field f = c.getDeclaredField("uname");
f.setAccessible(true); //如果屬性為private可以設定為可以通路,包括私有方法
f.set(user3, "pengpeng"); //通過反射寫屬性的值
System.out.println(f.getName()); //通過反射讀屬性值
System.out.println(f.get(user3));
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}