020.Java的反射機制
阿新 • • 發佈:2018-12-27
定義
JAVA反射機制是在執行狀態中,
對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個物件,都能夠呼叫它的任意方法和屬性;
這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。
應用場景
Jdbc 載入驅動-----
Spring ioc
框架
獲取類的三種方式
package cn.qbz.thread;
public class Test112003 {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("cn.qbz.thread.Test112002");
System.out.println(c1);
Class c2 = Test112002.class;
System.out.println(c2);
Test112002 test112002 = new Test112002();
Class c3 = test112002.getClass();
System.out.println(c3);
}
}
建立物件的兩種方式
package cn. qbz.thread;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test112003 {
public static void main(String[] args) throws ClassNotFoundException,
IllegalAccessException, InstantiationException,
NoSuchMethodException, InvocationTargetException {
//通過無參構造器構造建立物件
Class c1 = Class.forName("cn.qbz.thread.User");
User user = (User) c1.newInstance();
user.setName("xiaoMing");
System.out.println(user.getName());
//通過有參構造器建立物件
Constructor constructor = c1.getConstructor(String.class, String.class);
User user2 = (User) constructor.newInstance("xiaoWang", "http://xiaowang.cn");
System.out.println("name:" + user2.getName() + "\t" + "url:" + user2.getUrl());
}
}
class User {
private String name;
private String url;
public User() {
}
public User(String name, String url) {
this.name = name;
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
常用API
方法名稱 | 作用 |
---|---|
getDeclaredMethods [] | 獲取該類的所有方法 |
getReturnType() | 獲取該類的返回值 |
getParameterTypes() | 獲取傳入引數 |
getDeclaredFields() | 獲取該類的所有欄位 |
setAccessible | 允許訪問私有成員 |
package cn.qbz.thread;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test112003 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
Class usr = Class.forName("cn.qbz.thread.User");
//獲取所有屬性
Field[] fields = usr.getDeclaredFields();
for (Field field : fields) {
System.out.println("屬性:" + field.getName());
}
//獲取所有方法
Method[] methods = usr.getDeclaredMethods();
for (Method method : methods) {
System.out.println("method:" + method.getName());
}
//初始化物件
User user = (User) usr.newInstance();
//使用反射賦值屬性
Field fieldName = usr.getDeclaredField("name");
// 標記為true 允許反射賦值
fieldName.setAccessible(true);
fieldName.set(user, "xiaoMing");
System.out.println("usr.name:" + user.getName());
}
}
class User {
private String name;
private String url;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
JDBC反射載入驅動
public class DemoJDBC {
public static void main(String[] args) throws Exception {
// 載入驅動類
Class.forName("com.mysql.jdbc.Driver");
// 通過DriverManager獲取資料庫連線
String url = "jdbc:mysql://192.168.1.150/test";
String user = "teamtalk";
String password = "123456";
Connection connection = (Connection) DriverManager.getConnection(
url, user, password);
PreparedStatement statement = (PreparedStatement) connection.prepareStatement(
"insert persion (name, age) value (?, ?)");
statement.setString(1, "hdu");
statement.setInt(2, 21);
statement.executeUpdate();
ResultSet resultSet = statement.executeQuery("select * from persion");
// 操作ResultSet結果集
while (resultSet.next()) {
// 第一種獲取欄位方式
System.out.println(resultSet.getString(1) + " " +
resultSet.getString(2) + " " + resultSet.getString(3));
}
// 關閉資料庫連線
resultSet.close();
statement.close();
connection.close();
}
}
禁止使用反射機制初始化
- 將建構函式為私有化