一、基本介紹
field.set方法是Java里一個核心的反射工具,用於將指定對象的成員變量的值設置為指定的值,例如:
Field field = object.getClass().getField("fieldName"); field.set(object, value);
其中,field是通過反射獲取的對象的成員變量,object是要設置值的對象實例,value是要設置的值。使用field.set方法可以避免破壞封裝性,直接設置一個私有成員變量的值。
二、應用場景
1、模板方法模式中的反射調用
在模板方法模式中,父類定義了一個模板方法,其中定義了子類要實現的抽象方法。具體實現則由子類實現。為了不破壞封裝性,在父類中定義了一些私有成員變量或方法,這些成員變量和方法可以被子類繼承和調用。在使用的過程中,需要使用反射來調用這些私有成員變量和方法,可以使用field.set方法來設置這些私有成員變量的值。
public abstract class AbstractTemplate { private String name; public final void doSomeThing() { doBefore(); doExecute(); doAfter(); } private void doBefore() { // some logic } protected abstract void doExecute(); private void doAfter() { // some logic } public AbstractTemplate setName(String name) { try { Field field = this.getClass().getSuperclass().getDeclaredField("name"); field.setAccessible(true); field.set(this, name); } catch (Exception e) { // handle exception } return this; } } public class ConcreteTemplate extends AbstractTemplate { @Override protected void doExecute() { // do something } }
2、ORM框架中的映射
ORM框架通過對象關係映射的方式將Java對象映射到數據庫中的表中。在映射過程中,需要將Java對象中的成員變量映射到數據庫表的列中。這些成員變量包括私有成員變量,為了避免破壞封裝性,需要使用field.set方法設置這些私有成員變量的值。
public class User { private Long id; private String username; private String password; // getters and setters } public class UserDao { public void save(User user) { try { Field idField = user.getClass().getDeclaredField("id"); Field usernameField = user.getClass().getDeclaredField("username"); Field passwordField = user.getClass().getDeclaredField("password"); idField.setAccessible(true); usernameField.setAccessible(true); passwordField.setAccessible(true); Long id = (Long) idField.get(user); String username = (String) usernameField.get(user); String password = (String) passwordField.get(user); // some logic to persist user to database } catch (Exception e) { // handle exception } } }
三、注意事項
1、權限
由於field.set方法可以設置對象中的私有成員變量的值,因此需要使用setAccessible(true)開啟權限,否則會拋出IllegalAccessException異常。
2、類型轉換
在使用field.set方法時,需要注意設置的值和成員變量的類型一致,否則會出現類型轉換異常。
3、性能
使用field.set方法比直接訪問成員變量的性能要低,因為需要進行反射操作,建議在必要的情況下使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157408.html