Apakah Java instanceof operator dianggap refleksi, dan apa yang mendefinisikan refleksi?

24

Saya berdiskusi dengan seorang rekan kerja hari ini, apakah penggunaan menggunakan operator Java instanceofadalah semacam refleksi. Dan diskusi dengan cepat berkembang menjadi apa yang sebenarnya mendefinisikan refleksi.

Jadi, apa definisi refleksi?

Dan apakah penggunaan instanceofdianggap "menggunakan refleksi"?

Dan selain itu, jika instanceofdianggap sebagai refleksi, maka apakah polimorfisme tidak juga "menggunakan refleksi"? Jika tidak, apa bedanya?

Bjarke Freund-Hansen
sumber
4
Anda sudah cukup banyak menjawab pertanyaan Anda sendiri. Bagaimana Anda mendefinisikan 'refleksi' menentukan apakah instanceofmerupakan contoh refleksi. Tentu saja itu adalah suatu tempat antara penggunaan data normal dan penggunaan metadata via getClass()& teman-teman, tetapi Anda dapat memiliki definisi yang bisa diterapkan dengan cara melayu.
Kilian Foth
Apakah penggunaan return"pemrograman struktural" dianggap?
SF.

Jawaban:

22

Ini adalah definisi refleksi menurut wikipedia:

Dalam ilmu komputer, refleksi adalah proses dimana sebuah program komputer dapat mengamati (melakukan ketik introspeksi) dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

Saya sendiri tidak bisa mengatakannya dengan lebih baik dan menyoroti bagian penting untuk pertanyaan Anda. Yang mengatakan, ya, instanceofdianggap menggunakan refleksi. Program mengamati strukturnya dan melakukan introspeksi jenis .

Elang
sumber
3
@ Seven Jeuris: Perbedaannya adalah yang if (true)terlihat pada nilai , bukan pada tipe . Itu sebabnya itu tidak dianggap refleksi.
sleske
1
@sleske: Alasan mengapa saya menyebutkan itu karena mengamati tipe adalah prinsip yang belum sempurna. Tanpanya tidak akan ada polimorfisme. Secara teknis ini berarti penimpaan sederhana juga dapat dianggap sebagai refleksi (atau setidaknya menghasilkan). Jangan lupa bagian kedua dari definisi: dan modifikasi struktur dan perilakunya sendiri saat runtime. Secara keseluruhan saya memutakhirkan jawaban ini (periksa komentar kedua saya), tapi saya mengerti dari mana pertanyaan dari OP itu berasal. ; p
Steven Jeuris
1
Menurut definisi refleksi itu, akankah polimorfisme normal tidak juga menjadi semacam refleksi?
Bjarke Freund-Hansen
4
@ bjarkef: Saya akan mengatakan "tidak", karena pengiriman virtual yang digunakan oleh polimorfisme dilakukan secara implisit oleh bahasa itu sendiri, daripada kode aplikasi secara eksplisit memeriksa objek yang dimaksud untuk mengidentifikasi karakteristiknya.
Dave Sherohman
2
@ Dave Sherohman: Saya juga menambahkan bahwa sebagian besar pekerjaan (mengatur tabel lompatan, dll) dilakukan pada waktu kompilasi, bukan waktu berjalan.
TMN
13

Demi kejelasan, saya akan mempertimbangkan dua jawaban.

Secara teoritis , instanceofadalah bentuk refleksi, seperti yang dijelaskan dalam jawaban Falcon .

Dalam ilmu komputer, refleksi adalah proses dimana sebuah program komputer dapat mengamati (melakukan ketik introspeksi) dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

Namun, secara praktis , ketika seorang programmer berbicara tentang menggunakan refleksi ia biasanya merujuk lebih dari sekadar memeriksa apakah suatu variabel adalah tipe tertentu. Ini adalah konsep yang belum sempurna, yang tanpanya, polimorfisme tidak akan mungkin terjadi .

Perhatikan bahwa menggunakan instanceofsering menunjukkan bau kode, dan polimorfisme yang tepat sering dapat digunakan sebagai gantinya.

Steven Jeuris
sumber
1
+1 untuk kemungkinan bau kode - tidak selalu, hanya potensi
Gary Rowe
2

Anda mungkin tertarik pada artikel berikut: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Kunci dalam artikel ini adalah potongan kode di mana mereka mensimulasikan kata kunci "instanceof" dengan menggunakan metode "isInstance" dari kelas "Class", yang merupakan bagian dari fitur refleksi Java.

Jalayn
sumber
Penjelasan yang bagus untuk Jawa.
Falcon
2

Karena jawaban yang lain, definisi di Wikipedia telah diubah (Kebetulan saya setuju dengan perubahan ini, tetapi saya bukan orang yang membuatnya) untuk menghapus bagian dalam tanda kurung:

Dalam ilmu komputer, refleksi adalah kemampuan program komputer untuk memeriksa, mengintrospeksi, dan memodifikasi struktur dan perilakunya sendiri pada saat runtime.

https://en.wikipedia.org/wiki/Type_introspection juga secara khusus mengatakan

Introspeksi tidak harus disamakan dengan refleksi

Saya tidak akan mempertimbangkan instanceofuntuk jatuh di bawah definisi pertama: program meneliti nilai, bukan struktur sendiri, dan tidak melibatkan nilai-nilai yang mewakili struktur program (di Jawa: java.lang.Class, java.reflect.Method, dll); ciri refleksi bekerja dengan nilai-nilai seperti itu.

Alexey Romanov
sumber
-5

YA, operator "instanceof" merupakan bentuk refleksi. Jawaban sebelumnya memberi tahu Anda alasannya.

"Refleksi" atau "introspeksi objek / kelas" adalah hype akhir-akhir ini, tetapi beberapa bahasa pemrograman telah menggunakan beberapa konsep itu, sejak beberapa waktu.

DOT NET (Java clone), (mis) banyak menggunakan.

umlcat
sumber
1
Uuuuhm, ... kawan?
Konrad Rudolph
3
Kalimat pertama Anda benar, dan mubazir di hadapan jawaban sebelumnya. Sisanya salah.
Frank Shearar