什么是反射?
1,反編譯:.class-->.java
2.通過反射機制訪問java對象的屬性,方法,構造方法等;
反射應用場景:
Jdbc 加載驅動-----
Spring ioc
框架
獲取類的三種方法
//第一種方式:
Classc1 = Class.forName("Employee");
//第二種方式:
//java中每個類型都有class 屬性.
Classc2 = Employee.class;
//第三種方式:
//java語言中任何一個java對象都有getClass 方法
Employee e = new Employee();
Classc3 = e.getClass(); //c3是運行時類 (e的運行時類是Employee)
代碼實現
創建User類
public class User { private Integer id; private String password; public User(){ System.out.println("無參構造"); } public User(Integer id, String password) { this.id = id; this.password = password; System.out.println("有參構造"); }
public String show(String s){
return s;
}
public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", password='" + password + '\'' + '}'; } }
1.創建無參構造函數
public class Demo1 { //通過反射創建無參構造函數 public static void main(String[] args) throws Exception { //通過反射機制獲取類 Class<?> clazz = Class.forName("org.lzh.xxx.User"); //通過反射機制創建User對象 User user = (User) clazz.getDeclaredConstructor().newInstance(); user.setId(20); System.out.println(user.getId()); } } 輸出: 無參構造 20
2.創建有參構造函數
public class Demo2 { //通過反射創建有參構造函數 public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("org.lzh.xxx.User"); //參數為成員類型.class Constructor<?> constructor = clazz.getConstructor(Integer.class, String.class); //賦值並強轉 User user = (User) constructor.newInstance(20, "abc"); System.out.println(user); } } 輸出: 有參構造 User{id=20, password='abc'}
3.通過反射給私有成員變量賦值
public class Demo3 { //通過反射給私有成員變量賦值 public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("org.lzh.xxx.User"); //創建無參構造函數,強轉成User類,得到User對象 Object o = clazz.getDeclaredConstructor().newInstance(); User user = (User) o; //參數與User中成員變量相同 Field id = clazz.getDeclaredField("id"); Field password = clazz.getDeclaredField("password"); //通過反射操作私有屬性,因為屬性是私有的,所以必須添加方法被允許訪問 id.setAccessible(true); //通過set方法給User對象的id賦值為20,下面同理 id.set(user, 20); password.setAccessible(true); password.set(user, "abc"); System.out.println(user); } } 輸出: 無參構造
User{id=20, password='abc'}
4.通過反射獲取帶參帶返回值成員方法並使用
public class Demo4 { public static void main(String[] args) throws Exception{ Class<?> clazz = Class.forName("org.lzh.xxx.User"); Object o = clazz.getDeclaredConstructor().newInstance(); //第一個參數是方法的名字,第二個參數是成員類型.class Method method = clazz.getMethod("show",String.class); //有返回值,object可以接收所有類型 Object invoke = method.invoke(o, "abc"); System.out.println(invoke); } } 輸出: 無參構造 abc