創(chuàng)建反射對象
// 第一種創(chuàng)建方法
User user = new User;
Class c = user.getClass();
// 第二種創(chuàng)建方法
Class c2 = User.getClass();
// 第三種創(chuàng)建方法(推薦)
Class c3 = Class.forName("com.kgc.j341.keshang001.User");
// 通過反射調用無參構造創(chuàng)建字節(jié)碼類User的對象
// Java 9之后被廢棄
User user = (User) c3.newInstance();
// 可用此方法代替
User user = (User) c1.getDeclaredConstructor().newInstance();
public class User {
private String name;
private int age;
private String sex;
public User() {
}
private User(String name) {
this.name = name;
}
public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
private void show() {
System.out.println("User [name=" + name + "\t, age=" + age+ "\t, sex=" + sex + "\t]");
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", sex=" +sex + "]";
}
}
- Constructor: 構造方法
- Method:普通方法
- Field:屬性
調用字節(jié)碼類中的構造方法
// 獲取字節(jié)碼對象
Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
// 調用有參構造實例化對象
User user = (User) clazz.getConstructor(String.class,
int.class, String.class).newInstance("張三", 18, "男");
System.out.println(user);
// 調用私有的構造方法實例化對象
Constructor constructor =clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
System.out.println(constructor.newInstance("李四"));
調用一般方法
// 獲取class文件對應的字節(jié)碼對象(Class對象)
Class c1 = Class.forName("cn.kgc.j341.keshang023.User");
// 通過反射機制調用無參構造創(chuàng)建對象
User user = (User) c1.getDeclaredConstructor().newInstance();
System.out.println(user.toString());
// 獲取反射對象類中的toString方法
Method m1 = c1.getDeclaredMethod("toString");
// 通過invoke()操作一般方法
System.out.println(m1.invoke(user));
Method m2 = c1.getDeclaredMethod("show");
// 如果方法是私有方法需要使用setAccessible()方法開啟私有開關才能進行操作
m2.setAccessible(true);
// 通過invoke()操作一般方法
m2.invoke(user);
System.out.println("***********************************");
// 操作有參方法 參數(shù)類型
Method m3 = c1.getDeclaredMethod("setName", String.class);
m3.invoke(user, "張三");
m3 = c1.getDeclaredMethod("setAge", int.class);
m3.invoke(user, 18);
m3 = c1.getDeclaredMethod("setSex", String.class);
m3.invoke(user, "男");
System.out.println(m1.invoke(user));
獲取屬性
Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
User user = (User) clazz.getDeclaredConstructor().newInstance();
// 獲取屬性
Field field = clazz.getDeclaredField("age");
// 打開私有化
field.setAccessible(true);
// 為屬性賦值
field.set(user, 18);
System.out.println(user);
方法
- getDeclaredConstructor():獲取反射對象的構造方法
- getConstructor():獲取非私有化的反射對象的構造方法
- newInstance():實例化對象
- getDeclaredField():獲取屬性
- getField():獲取非私有化的屬性
- getDeclaredMethod():獲取一般方法
- getMethod():獲取非私有化的方法
- set():設置獲取的屬性值
- setAccessible():打開私有開關
- invoke():調用方法