Kelas karo lapangan pribadi

Sampeyan kabeh ngerti banget babagan modifier akses lapangan. Lan yen lapangan duwe modifier pribadi , mula kita ora bisa ngakses saka njaba.


public class Person {
  private int age;
  public String nickname;
  public Person(int age, String nickname) {
   this.age = age;
   this.nickname = nickname;
  }
}

Ayo priksa aksesibilitas ing kelas Utama kita :


public class Main {
   public static void main(String[] args) {
     Person person = new Person();  
     System.out.println(person.nickname);
    // System.out.println(person.age); No access to the field
  }
}

Kita ora duwe akses menyangumurlapangan, nanging kita duwe bayangan. :) Lan kanthi bantuan, kita bisa ngakses lan nggarap lapangan pribadi.

Njupuk lapangan pribadi saka obyek nggunakake refleksi

Ayo entuk array kabeh kolom ing kelas nggunakake metode getDeclaredFields () . Iki ngasilake obyek Field sing bisa digarap lan diowahi:


public static void main(String[] args) {
        Field[] fields = Person.class.getDeclaredFields();
        List<String> actualFieldNames = getFieldNames(fields);
        actualFieldNames.forEach(System.out::println);
    }

    static List<String> getFieldNames(Field[] fields) {
        List<String> fieldNames = new ArrayList<>();
        for (Field field : fields)
            fieldNames.add(Modifier.toString(field.getModifiers()) + " " + field.getName());
        return fieldNames;
    }
umur pribadi
julukan umum

Ing metode getFieldNames , kita entuk rong kolom saka kelas kita. Cara getModifiers ngasilake modifier lapangan kita, lan getName ngasilake jenenge. Saiki ayo nyoba ngowahi lan ngakses lapangan iki. Pisanan, ayo nyoba njupuk data saka lapangan umum:


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("nickname");
    String nickname = (String) field.get(person);
    System.out.println(nickname);

    System.out.println(person.nickname);
}
KodeGym
KodeGym

Kita bisa ngakses lapangan kanthi bantuan refleksi lan nggunakake referensi kanggo obyek kasebut. Kabeh apik! Ayo pindhah menyang lapangan pribadi.

Kita bakal ngganti jeneng kolom sing dijaluk dadi pribadiumurlapangan:


public static void main(String[]args)throws NoSuchFieldException, IllegalAccessException {
		Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    int age =(int)field.get(person);
    System.out.println(age);

    // System.out.println(person.age);
}

Kita ora duwe akses liwat obyek sing digawe, mula coba gunakake refleksi. Kita entuk kesalahan:

IllegalAccessException

Kita entuk IllegalAccessException . Ayo ndeleng apa sing ana ing njero:

Ayo dadi nyoba kanggo mangerteni.

IllegalAccessException dibuwang nalika aplikasi nyoba nggawe conto kanthi reflektif (liyane saka array), nyetel utawa entuk lapangan, utawa njaluk metode, nalika metode sing saiki ditindakake ora duwe akses menyang definisi kelas, lapangan, metode, utawa konstruktor.

Cara ing kene uga mbuwang pengecualian iki. Kanggo ngindhari pangecualian iki, kita bakal nggunakake cara khusus kanggo ngakses lapangan pribadi.

setAccessible(boolean flag)

Cara iki ndadekake iku bisa kanggo supaya mriksa akses keamanan kanggo lapangan utawa kelas. Kita bisa ngliwati cara sing bener utawa salah kanggo nemtokake manawa mriksa akses keamanan bakal ditindakake kanggo lapangan. Ayo nyoba ndandani kode kita:


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    field.setAccessible(true);

    int age = (int) field.get(person);
    System.out.println("The current value is " + age);
}

Ayo katon ing asil:

Nilai saiki yaiku 10

apik tenan! Kita entuk informasi babagan kelas kita. Ayo uga nyoba ngganti lapangan kanthi menehi nilai anyar:


public static void main(String[]args)throws NoSuchFieldException, IllegalAccessException {
Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    field.setAccessible(true);

    field.set(person, 19);

    int age =(int)field.get(person);
    System.out.println("The current value is " + age);
}

Sawise ngganti lapangan, kita entuk:

Nilai saiki yaiku 19

Ayo coba nelpon setAccessible(false) .


public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Person person = new Person(10, "CodeGym");

    Field field = Person.class.getDeclaredField("age");
    
    field.setAccessible(true);
    field.set(person, 19);
    field.setAccessible(false);

    System.out.println("The current value is " + field.get(person));
}

Sawise mulihake aksesibilitas menyang false , kita mbukak maneh pengecualian nalika nyoba nelpon metode get :

Dadi ati-ati nalika nggarap lapangan pribadi , lan aja lali yen refleksi minangka alat sing kuat banget!