Java筆試題:給定一個ReadOnlyClass的物件roc,能否把這個物件的age值改成30?

尚學堂明輝發表於2019-01-19

在Java筆試面試中,經常會遇到程式碼題,今天我們就來看一則Java程式碼筆試題。

有如下程式碼:


   Class ReadOnlyClass {

         private  Integer age=20;

         public Integer getAge() {return age;}

     }

  

現給定一個ReadOnlyClass的物件roc,能否把這個物件的age值改成30?

從正常程式設計的角度出發分析會發現,在本題中,age屬性被修飾為 private,而且這個類只提供了獲取age的 public的方法,而沒有提供修改age的方法,因此,這個類是一個只讀的類,無法修改age的值。但是Java語言還有一個非常強大的特性:反射機制,所以本題中,可以通過反射機制來修改age的值。

在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取物件的資訊以及動態呼叫物件的方法的功能稱為Java語言的反射機制。Java反射機制容許程式在執行時載入、探知、使用編譯期間完全未知的Class換句話說Java可以載入一個執行時才得知名稱的Class,獲得其完整結構。

在Java語言中,任何一個類都可以得到對應的 Class 例項,通過class例項就可以獲取類或物件的所有資訊,包括屬性(Field物件)、方法( Method物件)或構造方法( Constructor物件)。對於本題而言,在獲取到 ReadOnly Class類的Class例項後,就可以通過反射機制獲取到age屬性對應的Field物件,然後可以通過這個物件來修改age的值,實現程式碼如下:

import java.lang.reflect.field;
class ReadOnlyClass {
         private Integer age =20;
         public Integer getAge() {
                   return age;
         }
}
public class Test {
          public static void main(string[] ages) throws Exception {
                    ReadOnlyClass pt = new ReadOnlyClass();
                    Class<?> clazz = ReadOnlyClass.class;
                    Field field = clazz.getDeclaredField("age")
                    field.setAccessible(ture);
                    field.set(pt,30);
                    System.out.println(pt.getAge());
          }
}
  

程式的執行結果為:30

這就是全部答案,上海尚學堂Java培訓提供技術支援,需要Java資料或學習視訊請留言,謝謝!

相關文章