Memanggil Metode dan Mengakses Field
Panggil metode privat dan atur field yang tidak dapat diakses menggunakan Method.invoke dan Field.set dengan setAccessible.
Memanggil Metode dan Mengakses Field adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
setAccessible: Melewati Pembatasan Akses
Panggil field.setAccessible(true) atau method.setAccessible(true) untuk melewati kontrol akses Java. Ini diperlukan untuk anggota pribadi. Pada Java 9+, akses modul yang sesuai juga diperlukan.
Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u)); // "Alice"
f.set(u, "Bob"); // mutate the private field
System.out.println(u.getName()); // "Bob"Membaca Nilai Atribut
Gunakan field.get(instance) untuk membaca nilai atribut apa pun, yang akan dibungkus untuk tipe primitif. Untuk atribut statis, berikan null sebagai instans.
Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instanceMengatur Nilai Atribut
Gunakan field.set(instance, value) untuk menulis atribut. Tipe nilai harus cocok atau dapat di-unbox secara otomatis. Mengatur atribut final melalui refleksi memiliki perilaku yang tidak terdefinisi pada mesin virtual Java modern.
Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");Memanggil Metode melalui Refleksi
Dapatkan objek Method, panggil setAccessible(true), lalu panggil metode tersebut dengan method.invoke(instance, args...). Nilai yang dikembalikan bertipe Object.
Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);Menangani InvocationTargetException
Jika metode yang dipanggil melempar pengecualian, refleksi membungkusnya dalam InvocationTargetException. Buka pembungkusnya dengan getCause().
try {
method.invoke(obj, args);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
System.err.println("Reflection error: " + e.getMessage());
}Memanggil Metode Statis
Berikan null sebagai argumen instans saat memanggil metode statis.
Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42Membuat Instans melalui Konstruktor
Dapatkan Constructor, panggil setAccessible(true) untuk konstruktor pribadi, lalu panggil newInstance(args...).
Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);Refleksi dalam Kerangka Kerja: Spring DI
Spring menggunakan refleksi untuk membuat instans komponen dan menyuntikkan dependensi. Spring memanggil konstruktor pribadi dan mengatur atribut pribadi untuk menghubungkan konteks aplikasi.
Akses Modul pada Java 9+
Pada Java 9+, modul secara bawaan membatasi setAccessible. Jika kelas berada dalam modul bernama, Anda mungkin perlu membuka paket tersebut: --add-opens java.base/java.lang=ALL-UNNAMED.
// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMEDMethodHandles sebagai Alternatif yang Lebih Cepat
MethodHandles.lookup().findVirtual() menyediakan pemanggilan metode reflektif dengan performa yang mendekati panggilan langsung setelah optimasi JIT. Ini menjadi pilihan utama dalam kode pustaka yang kritis terhadap performa.
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);Praktik Terbaik Refleksi
Simpan objek Field/Method dalam cache—jangan pernah mengambilnya di dalam perulangan yang sering dijalankan. Bungkus refleksi dalam kelas layanan. Pertimbangkan MethodHandles untuk meningkatkan performa. Jika memungkinkan, dahulukan antarmuka daripada refleksi.
Pemeriksaan Singkat
Saat metode yang dipanggil melalui refleksi melempar pengecualian, pengecualian apa yang membungkus penyebabnya?
Rangkuman
Gunakan setAccessible(true) untuk mengakses anggota pribadi. Panggil metode melalui method.invoke(). Buka pembungkus InvocationTargetException. Simpan objek reflektif dalam cache. Dahulukan MethodHandles untuk jalur yang sering dijalankan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memanggil Metode dan Mengakses Field” gratis?
Ya — teks lengkap “Memanggil Metode dan Mengakses Field” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Memanggil Metode dan Mengakses Field”?
Panggil metode privat dan atur field yang tidak dapat diakses menggunakan Method.invoke dan Field.set dengan setAccessible. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Memanggil Metode dan Mengakses Field” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Inspeksi Class dengan Reflection
- Memanggil Metode dan Mengakses Field
- Proksi Dinamis dengan InvocationHandler
- Kinerja Reflection dan Alternatifnya