1. 程式人生 > >020.Java的反射機制

020.Java的反射機制

定義

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();
    }
}

禁止使用反射機制初始化

  • 將建構函式為私有化