7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

Mempelajari Java untuk Pengembang Android: Dasar Reflection

Read Time: 8 mins
This post is part of a series called Learn Java for Android Development.
Learn Java for Android Development: Working with Arrays
Learn Java for Android Challenge: Iteration

Indonesian (Bahasa Indonesia) translation by Yanti Baddolo (you can also view the original English article)

Pada tutorial ini, Anda akan menjadi familiar dengan konsep dari Reflection pada Java: kemampuan sebuah class atau object untuk memeriksa detil dari implementasinya masing-masing di dalam program.

Aplikasi Android ditulis menggunakan Java, sebuah bahasa pemrograman yang mendukung reflection – kemampuan sebuah object untuk memeriksa dirinya sendiri. Di tutorial ini, Ana akan memperlajari dasar-dasar dari reflection pada Java, termasuk bagaimana cara memeriksa method atau field dari sebuah class, memerika ketersediaan method tertentu, dan tugas-tugas lainnya yang mungkin Anda butuhkan ketika mengembangkan versi berbeda dari Android SDK.

Apa yang Anda Butuhkan

Secara teknis, Anda tidak memerlukan alat apapun untuk menyelesaikan tutorial ini, tetapi Anda pasti akan membutuhkan alat-alat tersebut untuk mengembangkan aplikasi Android. 

Untuk mengembangkan aplikasi Android (atau aplikasi Java apapun), Anda membutuhkan sebuah development environment untuk menulis dan membangun aplikasi. Eclipse adalah salah satu development environment (IDE) yang sangat popular untuk Java dan IDE terbaik untuk pengembangan Android. Eclipse tersedia gratis untuk OS Windows, Mac dan Linux.

Instruksi lengkap mengenai cara install Eclipse (termasuk versi mana saja yang didukung) dan Android SDK, kunjungi situs Android developer.

Mengapa Menggunakan Reflection?

Reflection memberikan para pengembang fleksibilitas untuk memeriksa dan menentukan karakteristik API dari runtime, ketimbang compile time. Di dalam batas-batas keamanan Java (contoh: public, protected, private), Anda dapat membuat sebuah object, mengakses field, dan memanggil method secara dinais. API dari reflection Java tersedia sebagai bagian dari paket java.lang.reflect, yang termasuk di dalam Android SDK untuk para pengembang gunakan. 

Jadi apa hubungannya ini dengan pengembangan Android? Dengan setiap versi baru dari Android SDK, class, interface, method dan sebagainya ditambahkan, diupdate dan (walaupun jarang) dikurangi. Namun, para pengembang Android seringkali ingin aplikasinya digunakan pada perangkat yang bekerja dengan versi Android berbeda dengan paket aplikasi yang sederhana. Untuk melakukan ini, para pengembang Android dapat menggunakan teknik reflection untuk menentukan (dalam runtime), jika suatu class atau method tersedia sebelum menggunakannya. Ini memungkinkan para pengembang untuk menggunakan API baru ketika tersedia namun tetap mendukung perangkat yang lebih tua – semua dalam 1 aplikasi yang sama.

Memeriksa Class

Class pada Java direpresentasikan ketika runtime menggunakan class Class (java.lang.Class). Class ini menyediakan titik permulaan dari semua API Reflection. Di dalam class ini, Anda akan menemukan banyak method yang berfungsi untuk memeriksa berbagai aspek dari class, seperti field, constructor, method, permission, dan sebagainya. Anda juga dapat menggunakan method dari Class yang disebut forName() untuk men-load class non-primitive (contonya bukan int, namun Integer) dengan namanya secara dinamis ketika runtime, ketimbang saat compile time:

Class ini (NotificationManager) tidak perlu memiliki pernyataan corresponding import di dalam kode Andal Anda tidak mengkompile class ini di dalam aplikasi Anda. Namun, class loader akan men-load class ini secara dinamis ketika runtime, jika memungkinkan. Anda kemudian dapat memeriksa object Class dan menggunakan teknik reflection yang akan dijelaskan berikutnya.

Memeriksa Constructor yang Tersedia di dalam sebuah Class

Anda dapat memeriksa constructor yang tersedia di dalam suatu Class. Untuk mendapat constructor yang tersedia secara public, gunakan getConstructors(). Tetapi, jika Anda ingin memeriksa method yang dideklarasikan di dalam class, apakah mereka public atau bukan, gunakan getDeclaredConstructors(). Kedua method mengembalikan sebuah array yang berisi object Constructor (java.lang.reflect.Constructor).

Sebagai contoh, kode berikut mengiterasi melalui constructor yang dideklarasikan di dalam sebuah class:

Ketika Anda memiliki sebuah object Constructor yang valid, Anda dapat memeriksa parameternya dan bahkan mendeklarasikan sebuah class baru menggunakan constructor yang sama dengan method newInstance().

Memeriksa Field yang Tersedia di dalam Class

Anda dapat memeriksa field (atau attribute) yang tersedia di dalam sebuah Class. Untuk mendapatkan method yang tersedia secara public, termasuk inherited field, gunakan getFields(). Namun, jika Anda ingin memeriksa field tersebut yang dideklarasikan di dalam class (dan bukan yang inherited), apakah mereka public atau bukan, gunakan getDeclaredFields(). Kedua method ini mengembalikan sebuah array yang berisi object Field (java.lang.reflec.Field).

Sebagai contoh, kode berikut mengiterasi melalui field yang dideklarasikan di dalam sebuah class:

Anda juga dapat mengecek sebuah field public tertentu dengan namanya menggunakan metode getField(). Sebagai contoh, untuk mengecek field EXTRA_CHANGED_PACKAGE_LIST dari Intent class (yang ditambahkan pada API Level 8, atau Android 2.2), Anda dapat menggunakan kode berikut:

Ketika Anda memiliki sebuah object Field yang valid, Anda dapat mendapatkan namanya menggunakan method toGenericString(). Jika Anda memiliki ijin yang sesuai, Anda juga dapat mengakses nilai dari field class tersebut menggunakan method get() dan set() yang tepat.

Memeriksa Method yang Tersedia di dalam Class

Anda dapat memeriksa method yang tersedia di dalam sebuah Class. Untuk mendapatkan method yang tersedia secara public, termasuk inherited method, gunakan getMethods(). Namun, jika Anda ingin memeriksa method tersebut yang dideklarasikan di dalam class (dan bukan yang inherited), apakah mereka public atau bukam, gunakan getDeclaredMethods(). Kedua method ini mengembalikan sebuah array yang berisi object Method (java.lang.reflect.Method).

Sebagai contoh, kode berikut mengiterasi melalui method yang dideklarasikan di dalam sebuah class:

Ketika Anda memiliki sebuah object Method yang valid, Anda dapat mendapatkan namanya menggunakan method toGenericString(). Anda juga dapat memeriksa parameter yang digunakan oleh metode dan pengecualian yang bisa dipindahkan. Jika Anda memiliki ijin yang sesuai, Anda juga dapat memanggil method tersebut menggunakan method invoke(). 

Memeriksa Inner Class

Anda dapat memeriksa inner class yang didefinisikan di dalam sebuah Class menggunakan getDeclaredClasses(). Method ini akan mengembalikan sebuah array yang berisi object Class (java.lang.class) yang dideklarasikan di dalam sebuah parent class. Class ini dapat diperiksa seperti yang lainnya.

Memeriksa Modifier Anggota

Anda juga dapat memeriksa pengaturan flag dan security – disebut modifier – yang berhubungan dengan suatu Class, Field, atau Method menggunakan method getModifiers(). Modifier yang menarik termasuk apakah suatu komponen public, private, protected, abstrak, final, atau static (dibandingkan yang lainnya).

Sebagai contoh, kode berikut mengecek security modifier dari sebuah class:

Ingatlah bahwa Anda tidak dapat mengakses atau memanggil secara dinamis semua class, method, atau field yang biasanya tiadk dapat diakses ketika compile time menggunakan reflection. Dengan kata lain, keamanan (security) dari class regular masih berlaku saat runtime.

Memeriksa Metadata Class

Anda juga dapat memeriksa metadata – disebut annotation – yang berhubungan dengan suatu Class, Field, atau Method menggunakan method getAnnotations(). Metadata yang menarik berhubungan dengan sebuah class dapat mengandung informasi tentang deprecation, warning, dan override, di antara hal-hal lainnya. 

Sebagai contoh, kode berikut mengecek metadata yang tersedia untuk class AbsoluteLayout. Karena class ini tidak tersedia di Android 1.5, salah satu annotation yang dikembalikan adalah @java.lang.Deprecated() ketika kode ini bekerja di Android 2.2:

Sama halnya, Anda juga dapat mengecek keberadaan dari annotation tertentu, seperti deprecation, sesuai dengan tipenya:

Reflection: Berguna untuk Debugging

Anda juga dapat menggunakan reflection untuk membantu proses debugging. Contohnya, Anda mungkin ingin menggunakan kata kunci class untuk mengakses data class di dalamnya untuk suatu tipe tertentu: 

Anda juga dapat mendapatkan informasi class dari sebuah variable instance menggunakan getClass() dari class Object (yang diwariskan oleh seluruh class di Java):

Jika Anda ingin mengecek class dari sebuah variabel, menggunakan instanceof akan lebih baik. Lihatlah tutorial sebelumnya tentang instanceof untuk penjelasan yang lebih detil.

Demikian juga, jika Anda ingin menggunakan method getClass() dengan kata kunci ini untuk mengecek nama dari class tempat Anda sekarang berada dan memasukkan informasi ini sebagai bagian dari debug logging ke LogCat:

Kenapa Jangan Menggunakan Reflection

Seperti yang telah Anda lihat, reflection dapat digunakan untuk efek yang baik, terutama ketika Anda tidak yakin jika sebuah class atau method tersedia saat compile time. Namun, reflection memiliki beberapa kelemahan, termasuk berkurangnya performa dan hilangnya praktek kode yang aman saat compile time. Gunakanlah reflection di saat yang penting saja.

Penutup

Reflection adalah sebuah alat yang powerful dan dapat digunakan oleh para pengembang Java untuk memeriksa paket dan API saat runtime. Walaupun operasi reflection memiliki kelemahan, mereka memberikan para pengembang fleksibilitas yang terkadang sangat penting untuk memastikan pekerjaan dapat terselesaikan. Para pengembang Android seringkali menggunakan teknik reflection sederhana ini untuk mengetes ketersediaan dari class, interface, method,  dan field tertentu saat runtime, memastikan mereka bekerja pada berbagai versi. 

Tentang Penulis

Pengembang Mobile Lauren Darcey dan Shane Conder telah berkontribusi dalam penulisan beberapa buku tentang pengembangan Android: sebuah buku tentang programming yang berjudul Android Wireless Application Development dan Sams TeachYouself Android Application Development in 24 Hours. Ketika tidak sedang menulis, mereka menghabiskan waktu mengembangkan mobile software di perusahaan mereka dan memberikan jasa konsultasi. Mereka dapat dihubungi melalui email ke [email protected], melalui blog mereka di androidbook.blogspot.com, dan di Twitter @androidwireless.

Butuh bantuan lebih untuk menulis aplikasi Android? Silahkan cek Resource dan Buku terbaru kami!

Buy Android Wireless Application Development, 2nd Edition Buy Sam's Teach Yourself Android Application Development in 24 Hours Mamlambo code at Code Canyon

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.