Apakah ada masalah dengan menggunakan Refleksi?


49

Saya tidak tahu mengapa, tetapi saya selalu merasa seperti "selingkuh" ketika saya menggunakan refleksi - mungkin itu karena kinerja hit saya tahu saya ambil.

Sebagian dari saya mengatakan, jika itu adalah bagian dari bahasa yang Anda gunakan dan itu dapat mencapai apa yang Anda coba lakukan, maka mengapa tidak menggunakannya. Bagian lain dari diriku mengatakan, harus ada cara aku bisa melakukan ini tanpa menggunakan refleksi. Saya kira mungkin itu tergantung situasi.

Apa potensi masalah yang perlu saya perhatikan ketika menggunakan refleksi dan seberapa khawatir saya tentang hal itu? Berapa banyak upaya yang perlu dikeluarkan untuk mencoba menemukan solusi yang lebih konvensional?


2
Saya kira itu tergantung pada bahasa dan lingkungannya. Beberapa mendukungnya, bahkan mendorongnya. Kadang-kadang ketika bekerja di Jawa saya mengharapkan dukungan refleksi yang lebih baik.
FrustratedWithFormsDesigner

18
Yah, saya kira itu tidak begitu sulit untuk dinstguish antara "kecurangan refleksi" dan penggunaan yang valid dari itu: Ketika Anda memeriksa anggota pribadi atau menggunakannya untuk memanggil metode pribadi (untuk bekerja di sekitar antarmuka), maka sangat mungkin curang. Ketika Anda menggunakannya untuk berinteraksi dengan tipe yang Anda tidak memiliki pengetahuan tentang, maka mungkin ok (penyatuan data, proksi dll).
Falcon

1
Bahasa apa yang Anda gunakan? Brainfuck tidak memiliki refleksi dan Python hanya berbeda.
Pekerjaan

1
Saya juga tidak pernah mengerti mengapa itu diizinkan untuk mengakses metode pribadi melalui refleksi. Menurut intuisi saya, itu harus dilarang.
Giorgio

3
Sulit dipercaya bahwa pertanyaan dengan kata-kata yang jelek itu mendapatkan 27 suara positif tanpa ada pengeditan.
Aaronaught

Jawaban:


48

Tidak, ini tidak curang - ini adalah cara untuk memecahkan masalah dalam beberapa bahasa pemrograman.

Sekarang, sering kali bukan solusi terbaik (paling bersih, paling sederhana, paling mudah untuk mempertahankan). Jika ada cara yang lebih baik, gunakan yang itu memang. Namun, terkadang tidak ada. Atau jika ada, itu jauh lebih kompleks, melibatkan banyak duplikasi kode dll yang membuatnya tidak layak (sulit untuk mempertahankan dalam jangka panjang).

Dua contoh dari proyek kami saat ini (Jawa):

  • beberapa alat pengujian kami menggunakan refleksi untuk memuat konfigurasi dari file XML. Kelas yang akan diinisialisasi memiliki bidang tertentu, dan loader config menggunakan refleksi untuk mencocokkan elemen XML yang dinamai fieldXdengan bidang yang sesuai di kelas, dan untuk menginisialisasi yang terakhir. Dalam beberapa kasus, ia dapat membangun kotak dialog GUI sederhana dari properti yang diidentifikasi dengan cepat. Tanpa refleksi, ini akan membutuhkan ratusan baris kode di beberapa aplikasi. Jadi refleksi membantu kami menyusun alat sederhana dengan cepat, tanpa banyak keributan, dan memungkinkan kami untuk fokus pada bagian penting (regresi menguji aplikasi web kami, menganalisis log server, dll.) Daripada yang tidak relevan.
  • satu modul aplikasi web lawas kami dimaksudkan untuk mengekspor / mengimpor data dari tabel DB ke lembar Excel dan kembali. Itu berisi banyak kode duplikat, di mana tentu saja duplikasinya tidak persis sama, beberapa dari mereka mengandung bug dll. Menggunakan refleksi, introspeksi dan anotasi, saya berhasil menghilangkan sebagian besar duplikasi, mengurangi jumlah kode dari atas 5K hingga di bawah 2.4K, sementara membuat kode lebih kuat dan cara lebih mudah untuk mempertahankan atau memperluas Sekarang modul itu tidak lagi menjadi masalah bagi kami - berkat penggunaan refleksi yang bijaksana.

Intinya adalah, seperti alat yang kuat, refleksi juga dapat digunakan untuk menembak diri sendiri di kaki. Jika Anda belajar kapan dan bagaimana (tidak) menggunakannya, itu dapat membawa Anda solusi yang elegan dan bersih untuk masalah yang sulit. Jika Anda menyalahgunakannya, Anda dapat mengubah masalah sederhana menjadi kekacauan yang rumit dan jelek.


8
+1 Refleksi sangat berguna untuk impor / ekspor data ketika Anda memiliki objek perantara karena alasan konversi.
Ed James

2
Ini juga sangat berguna dalam aplikasi berbasis data - alih-alih menggunakan tumpukan besar if (propName = n) setN(propValue);, Anda dapat memberi nama (yaitu) tag XML Anda sama dengan properti kode Anda dan menjalankan perulangan di atasnya. Metode ini juga membuatnya lebih mudah untuk menambahkan properti nanti.
Michael K

Refleksi banyak digunakan dalam antarmuka Fluent, seperti FluentNHibernate.
Scott Whitlock

4
@Michael: Sampai Anda memutuskan untuk mengubah nama salah satu properti di kelas dan menemukan bahwa kode Anda meledak. Jika Anda tidak perlu mempertahankan keterbandingan dengan hal-hal yang dihasilkan oleh program Anda, itu bagus, tapi saya kira itu bukan sebagian besar dari kita.
Billy ONeal

1
@Billy, saya tidak bermaksud menentang Anda, saya setuju dengan apa yang Anda tulis. Meskipun, contoh yang Anda bawa adalah IMHO lebih banyak subcase dari aturan umum "menghindari perubahan antarmuka publik".
Péter Török

37

Itu tidak curang. Tapi itu biasanya ide yang buruk dalam kode produksi untuk setidaknya alasan berikut:

  • Anda kehilangan keamanan tipe waktu kompilasi - akan sangat membantu jika kompiler memverifikasi bahwa suatu metode tersedia pada waktu kompilasi. Jika Anda menggunakan refleksi, Anda akan mendapatkan kesalahan saat runtime yang mungkin mempengaruhi pengguna akhir jika Anda tidak menguji dengan cukup baik. Bahkan jika Anda menangkap kesalahan, itu akan lebih sulit untuk di-debug.
  • Ini menyebabkan bug ketika refactoring - jika Anda mengakses anggota berdasarkan namanya (misalnya menggunakan string yang dikodekan) maka ini tidak akan diubah oleh sebagian besar alat kode refactoring dan Anda akan langsung memiliki bug, yang mungkin cukup sulit dilacak.
  • Performa lebih lambat - refleksi pada saat runtime akan lebih lambat daripada pemanggilan metode / variabel lookup yang dikompilasi secara statis. Jika Anda hanya melakukan refleksi sesekali maka itu tidak masalah, tetapi ini bisa menjadi hambatan kinerja dalam kasus di mana Anda membuat panggilan melalui refleksi ribuan atau jutaan kali per detik. Saya pernah mendapat speedup 10x dalam beberapa kode Clojure hanya dengan menghilangkan semua refleksi, jadi ya, ini adalah masalah nyata.

Saya sarankan membatasi penggunaan refleksi untuk kasus-kasus berikut:

  • Untuk prototyping cepat atau kode "throwaway" ketika itu adalah solusi paling sederhana
  • Untuk kasus penggunaan refleksi asli , mis. Perkakas IDE yang memungkinkan pengguna untuk memeriksa bidang / metode objek arbitrer saat runtime.

Dalam semua kasus lainnya, saya sarankan mencari pendekatan yang menghindari refleksi. Menentukan antarmuka dengan metode yang sesuai dan menerapkannya pada set kelas yang Anda ingin memanggil metode biasanya cukup untuk menyelesaikan sebagian besar kasus sederhana.


3
+1 - ada beberapa kasus penggunaan untuk refleksi; tetapi sebagian besar waktu saya melihat programmer menggunakannya, mereka menutupi desain dengan kekurangan yang serius. Tentukan antarmuka dan upaya untuk menghapus ketergantungan pada refleksi. Sama seperti GOTO, ia memiliki kegunaannya, tetapi kebanyakan dari mereka tidak baik. (Beberapa dari mereka bagus, tentu saja)
Billy ONeal

3
Ingatlah bahwa poin di atas mungkin berlaku atau mungkin tidak berlaku untuk bahasa favorit Anda. Sebagai contoh, refleksi tidak memiliki penalti kecepatan di Smalltalk, Anda juga tidak kehilangan keamanan waktu kompilasi, karena perhitungan sepenuhnya terlambat.
Frank Shearar

Refleksi dalam D tidak memiliki kelemahan yang Anda sebutkan. Jadi saya berpendapat bahwa Anda menyalahkan implementasi dalam beberapa bahasa lebih dari refelection itu sendiri. Saya tidak tahu banyak tentang smalltalk, tetapi menurut @ Frank Shearar, itu tidak memiliki kelemahan thoses juga.
deadalnix

2
@deadalinx: Ke sisi negatif manakah Anda merujuk? Ada beberapa jawaban ini. Masalah kinerja adalah satu-satunya hal yang bergantung pada bahasa.
Billy ONeal

1
Saya harus menambahkan bahwa masalah kedua - bug yang disebabkan selama refactoring - mungkin yang paling serius. Secara khusus, mengandalkan sesuatu yang memiliki nama tertentu akan langsung rusak ketika nama benda itu berubah. Kesalahan yang disebabkannya mungkin kurang informatif, kecuali Anda sangat berhati-hati.
Frank Shearar

11

Refleksi hanyalah bentuk lain dari pemrograman meta, dan sama validnya, dengan parameter berbasis tipe yang Anda lihat dalam kebanyakan bahasa saat ini. Refleksi sangat kuat dan generik, dan program reflektif adalah tingkat tinggi pemeliharaan (bila digunakan dengan benar, tentu saja) dan lebih daripada program berorientasi objek atau prosedur murni. Ya, Anda membayar harga kinerja - tetapi dengan senang hati saya akan pergi untuk program yang lebih lambat yang lebih dapat dipertahankan dalam banyak, atau bahkan sebagian besar, kasus.


2
1, ini membantu saya memahami apa refleksi adalah . Saya seorang programmer C ++, dan jadi saya tidak pernah benar-benar merenung refleksi. Ini membantu. (Meskipun saya akui itu dari sudut pandang saya, Refleksi sepertinya merupakan upaya untuk mendamaikan kekurangan dalam bahasa. Kami C ++ guys menggunakan templat untuk itu. Jadi saya kira Anda bisa mengatakan hal yang sama. :)
greyfade

4
Kinerja ulang - dalam beberapa kasus, Anda dapat menggunakan API refleksi untuk menulis kembali kode kinerja penuh. Misalnya, dalam .NET Anda dapat menulis IL ke dalam aplikasi saat ini - maka kode "refleksi" Anda bisa sama cepat dengan kode lainnya (kecuali Anda dapat menghapus banyak if / else / apa pun, seperti yang telah Anda lakukan sebelumnya. menemukan aturan yang tepat)
Marc Gravell

@ Greyfade: Dalam arti, templat melakukan refleksi waktu kompilasi saja. Mampu melakukannya saat runtime memiliki keuntungan memungkinkan kemampuan yang kuat untuk dibangun dalam aplikasi tanpa harus melakukan kompilasi ulang. Anda menukar kinerja untuk fleksibilitas, tradeoff yang dapat diterima lebih banyak daripada yang Anda harapkan (mengingat latar belakang C ++ Anda).
Donal Fellows

Saya tidak mengerti jawaban Anda. Anda tampaknya mengatakan bahwa program yang menggunakan refleksi lebih dapat dikelola daripada yang tidak, seolah-olah refleksi adalah model pemrograman yang unggul yang harus menggantikan program berorientasi objek dan program jika kinerja tidak diperlukan.
DavidS

8

Tentunya semua tergantung pada apa yang ingin Anda capai.

Sebagai contoh, saya menulis aplikasi pemeriksa media yang menggunakan injeksi ketergantungan untuk menentukan jenis media apa (file MP3 atau file JPEG) untuk diperiksa. Shell perlu menampilkan kotak yang berisi informasi terkait untuk masing-masing jenis, tetapi tidak memiliki pengetahuan tentang apa yang akan ditampilkan. Ini didefinisikan dalam majelis yang membaca jenis media itu.

Karena itu saya harus menggunakan refleksi untuk mendapatkan jumlah kolom untuk ditampilkan dan jenis serta namanya sehingga saya dapat mengatur kisi dengan benar. Itu juga berarti bahwa saya dapat memperbarui perpustakaan yang disuntikkan (atau membuat yang baru) tanpa mengubah kode atau file konfigurasi lainnya.

Satu-satunya cara lain adalah memiliki file konfigurasi yang perlu diperbarui ketika saya mengganti jenis media yang sedang diperiksa. Ini akan memperkenalkan titik kegagalan lain untuk aplikasi.


1
"Tentunya itu semua tergantung pada apa yang ingin kamu capai." +1
DaveShaw

7

Refleksi adalah alat yang luar biasa jika Anda seorang penulis perpustakaan , dan karenanya tidak memiliki pengaruh terhadap data yang masuk. Kombinasi dari refleksi dan meta-pemrograman dapat memungkinkan perpustakaan Anda untuk bekerja secara lancar dengan penelepon yang sewenang-wenang, tanpa mereka harus melewati rintangan pembuatan kode dll.

Saya mencoba untuk mencegah refleksi dalam kode aplikasi , meskipun; pada lapisan aplikasi Anda harus menggunakan metafora yang berbeda - antarmuka, abstraksi, enkapsulasi dll.


Perpustakaan seperti itu sering sulit digunakan dan sebaiknya dihindari (misalnya Musim Semi).
Sridhar Sarnobat

@ Sridhar jadi Anda belum pernah menggunakan API serialisasi apa pun? Atau ORM / mikro-ORM?
Marc Gravell

Saya telah menggunakan mereka melalui pilihan saya sendiri. Ini telah melemahkan semangat menghadapi masalah yang bisa saya hindari jika saya tidak diberi tahu apa yang harus dilakukan.
Sridhar Sarnobat

7

Refleksi fantastis untuk membangun alat untuk pengembang.

Karena memungkinkan lingkungan build Anda untuk memeriksa kode dan berpotensi menghasilkan alat yang tepat untuk memanipulasi / init memeriksa kode.

Sebagai teknik pemrograman umum, ini bisa bermanfaat tetapi lebih rapuh dari yang dibayangkan kebanyakan orang.

Salah satu pengembangan yang digunakan untuk refleksi (IMO) adalah membuat penulisan pustaka streaming generik menjadi sangat sederhana (selama deskripsi kelas Anda tidak pernah berubah (maka itu menjadi solusi yang sangat rapuh)).


Memang, Spring "lebih rapuh dari yang dibayangkan kebanyakan orang."
Sridhar Sarnobat

5

Penggunaan refleksi sering berbahaya dalam bahasa OO jika tidak digunakan dengan penuh kesadaran.

Saya telah kehilangan hitungan berapa banyak pertanyaan buruk yang saya lihat di situs StackExchange di mana

  1. Bahasa yang digunakan adalah OO
  2. Penulis ingin mengetahui jenis objek apa yang telah dilewati dan kemudian memanggil salah satu metodenya
  3. Penulis menolak untuk menerima bahwa refleksi adalah teknik yang salah dan menuduh siapa pun yang menunjukkan ini sebagai "tidak tahu bagaimana membantu saya"

Berikut adalah contoh tipikal.

Sebagian besar titik OO adalah itu

  1. Anda mengelompokkan fungsi-fungsi yang tahu bagaimana memanipulasi struktur / konsep dengan benda itu sendiri.
  2. Pada titik mana pun dari kode Anda, Anda harus cukup tahu tentang jenis objek untuk mengetahui fungsi yang relevan yang dimilikinya dan memintanya untuk memanggil versi khusus fungsi tersebut.
  3. Anda memastikan kebenaran dari poin sebelumnya dengan menentukan tipe input yang benar untuk setiap fungsi dan membuat setiap fungsi tidak tahu lebih banyak (dan tidak melakukan lebih) daripada yang relevan.

Jika pada titik mana pun dalam kode Anda, titik 2 tidak valid untuk objek yang telah Anda lewati maka satu atau lebih dari ini adalah benar

  1. Input yang salah dimasukkan
  2. Kode Anda terstruktur dengan buruk
  3. Anda tidak tahu apa yang sedang Anda lakukan.

Pengembang yang kurang terampil sama sekali tidak mendapatkan ini dan percaya bahwa mereka dapat lulus apa pun di bagian mana pun dari kode mereka dan melakukan apa yang mereka inginkan dari serangkaian kemungkinan (hard-coded) kemungkinan. Idiot ini menggunakan refleksi banyak .

Untuk bahasa OO, refleksi seharusnya hanya diperlukan dalam aktivitas meta (pemuat kelas, injeksi ketergantungan dll). Dalam konteks tersebut, refleksi diperlukan karena Anda menyediakan layanan generik untuk membantu manipulasi / konfigurasi kode yang tidak Anda ketahui tentang alasan yang baik dan sah. Dalam hampir semua situasi lain, jika Anda ingin melakukan refleksi maka Anda melakukan sesuatu yang salah dan Anda perlu bertanya pada diri sendiri mengapa potongan kode ini tidak cukup tahu tentang objek yang telah diteruskan ke sana.


3

Alternatif, dalam kasus di mana domain dari kelas yang direfleksikan didefinisikan dengan baik, adalah menggunakan refleksi bersama dengan metadata lain untuk menghasilkan kode , alih-alih menggunakan refleksi pada saat runtime. Saya melakukan ini menggunakan FreeMarker / FMPP; ada banyak alat lain untuk dipilih. Keuntungannya adalah Anda berakhir dengan kode "nyata" yang dapat dengan mudah di-debug, dll.

Bergantung pada situasinya, ini dapat membantu Anda membuat kode lebih cepat - atau hanya banyak mengasapi kode. Ini menghindari kerugian refleksi:

  • kehilangan jenis keamanan waktu kompilasi
  • bug karena refactoring
  • kinerja lebih lambat

disebutkan sebelumnya.

Jika refleksi terasa seperti selingkuh, itu mungkin karena Anda mendasarkannya pada banyak dugaan yang tidak Anda yakini, dan usus Anda memperingatkan Anda bahwa ini berisiko. Pastikan untuk menyediakan cara untuk meningkatkan metadata yang melekat dalam refleksi dengan metadata Anda sendiri, di mana Anda dapat menggambarkan semua kebiasaan dan kasus khusus dari kelas dunia nyata yang mungkin Anda temui.


2

Itu tidak curang, tetapi seperti alat apa pun, itu harus digunakan untuk apa yang dimaksudkan untuk dipecahkan. Refleksi, menurut definisi, memungkinkan Anda untuk memeriksa dan memodifikasi kode melalui kode; jika itu yang perlu Anda lakukan, maka refleksi adalah alat untuk pekerjaan itu. Refleksi adalah semua tentang meta-code: Kode yang menargetkan kode (bukan kode biasa, yang menargetkan data).

Contoh penggunaan refleksi yang baik adalah kelas antarmuka layanan web generik: Desain tipikal adalah memisahkan implementasi protokol dari fungsionalitas payload. Jadi, Anda memiliki satu kelas (sebut saja T) yang mengimplementasikan muatan Anda, dan kelas lain yang mengimplementasikan protokol ( P). Tcukup mudah: untuk setiap panggilan yang ingin Anda lakukan, cukup tulis satu metode yang melakukan apa pun yang seharusnya dilakukan. PNamun, perlu memetakan panggilan layanan web ke panggilan metode. Membuat pemetaan ini generik diinginkan, karena menghindari redundansi, dan membuatnya Psangat dapat digunakan kembali. Reflection menyediakan sarana untuk memeriksa kelas Tsaat runtime dan memanggil metode-metodenya berdasarkan string yang diteruskan ke Pdalam protokol layanan web, tanpa pengetahuan kompilasi waktu dari kelasT. Menggunakan aturan 'kode tentang kode', orang dapat berargumen bahwa kelas Pmemiliki kode di kelas Tsebagai bagian dari datanya.

Namun.

Refleksi juga memberi Anda alat untuk mengatasi pembatasan sistem tipe bahasa - secara teoritis, Anda bisa melewati semua parameter sebagai tipe object, dan memanggil metode mereka melalui refleksi. Voa, bahasa yang seharusnya menegakkan disiplin pengetikan statis yang kuat sekarang berperilaku seperti bahasa yang diketik secara dinamis dengan pengikatan yang terlambat, hanya saja sintaksanya jauh lebih rumit. Setiap contoh dari pola semacam itu yang saya lihat sejauh ini merupakan peretasan yang kotor, dan selalu, solusi dalam sistem jenis bahasa akan mungkin, dan itu akan lebih aman, lebih elegan, dan lebih efisien dalam segala hal .

Ada beberapa pengecualian, seperti kontrol GUI yang dapat terikat data ke berbagai jenis sumber data yang tidak terkait; mengamanatkan bahwa data Anda mengimplementasikan antarmuka tertentu supaya Anda dapat mengikat data itu tidak realistis, dan tidak ada programmer yang menerapkan adaptor untuk setiap jenis sumber data. Dalam hal ini, menggunakan refleksi untuk mendeteksi jenis sumber data dan menyesuaikan pengikatan data adalah pilihan yang lebih berguna.


2

Satu masalah yang kami miliki dengan Reflection adalah ketika kami menambahkan Kebingungan ke dalam campuran. Semua kelas mendapatkan nama baru dan tiba-tiba memuat kelas atau fungsi dengan namanya berhenti berfungsi.


1

Itu sangat tergantung. Contoh dari sesuatu yang akan sulit dilakukan tanpa refleksi adalah mereplikasi ObjectListView . Itu juga menghasilkan kode IL on the fly.


1

Refleksi adalah metode utama untuk menciptakan sistem berbasis konvensi. Saya tidak akan terkejut menemukan itu sedang digunakan di sebagian besar kerangka kerja MVC. Ini adalah komponen utama dalam ORM. Kemungkinannya, Anda sudah menggunakan komponen yang dibangun dengannya setiap hari.

Alternatif untuk penggunaan semacam itu adalah konfigurasi, yang memiliki kekurangannya sendiri.


0

Refleksi dapat mencapai hal-hal yang tidak bisa dilakukan secara praktis sebaliknya.

Misalnya, pertimbangkan cara mengoptimalkan kode ini:

int PoorHash(char Operator, int seed, IEnumerable<int> values) {
    foreach (var v in values) {
        seed += 1;
        switch (char) {
            case '+': seed += v; break;
            case '^': seed ^= v; break;
            case '-': seed -= v; break;
            ...
        }
        seed *= 3;
    }
    return seed;
}

Ada pukulan uji mahal di tengah loop dalam, tetapi mengekstraknya membutuhkan penulisan ulang loop sekali untuk setiap operator. Refleksi memungkinkan kita untuk mendapatkan kinerja yang setara dengan mengekstraksi tes itu, tanpa mengulangi loop selusin kali (dan dengan demikian mengorbankan pemeliharaan). Cukup hasilkan dan kompilasi loop yang Anda butuhkan dengan cepat.

Saya sebenarnya telah melakukan optimasi ini , walaupun situasinya sedikit lebih rumit, dan hasilnya luar biasa. Urutan peningkatan besar dalam kinerja dan lebih sedikit baris kode.

(Catatan: Saya awalnya mencoba yang setara dengan melewatkan di Func alih-alih char, dan itu sedikit lebih baik, tetapi hampir tidak mencapai refleksi 10x.)


1
Optimasi yang lebih baik adalah dengan melewatkan functor sebagai gantinya. Kemungkinan akan mendapatkan inline saat runtime oleh kompiler JIT dan lebih dapat dipertahankan daripada refleksi.
Billy ONeal

Itu akan lebih mudah dikelola, dan saya benar-benar mencobanya terlebih dahulu, tetapi itu tidak cukup cepat. JIT jelas-jelas bukan inlining, mungkin karena dalam kasus saya ada loop dalam kedua atas operasi yang harus dilakukan.
Craig Gidney

Juga, saya tunjukkan bahwa apa yang Anda dapatkan di sana adalah kode modifikasi sendiri, yang sebenarnya bukan refleksi. Seseorang mengaksesnya melalui API refleksi di sebagian besar bahasa yang mendukung refleksi, tetapi itu bisa dilakukan hanya dalam bahasa yang tidak mendukung refleksi (misalnya, itu mungkin di C ++)
Billy ONeal

Saya ingin menghindari contoh 'kesetaraan struktural' standar. Refleksi tidak diperlukan untuk kode modifikasi diri, tetapi tentu saja membantu.
Craig Gidney

Tidak juga. Anda dapat melakukannya dalam bahasa non-refleksi dengan baik.
Billy ONeal

-2

Tidak mungkin itu curang ... Sebaliknya, ini memberdayakan server aplikasi untuk menjalankan kelas yang dibuat oleh pengguna dengan nama pilihan mereka, karenanya memberikan fleksibilitas kepada pengguna, bukan menipu mereka.

Dan jika Anda ingin melihat kode file .class apa saja (di Jawa) maka ada beberapa dekompiler yang tersedia secara gratis!


Dekompilasi bukan fitur refleksi.
Billy ONeal

ya, itu bukan ... Tapi saya bermaksud mengatakan bahwa jika Anda merasa ingin selingkuh saat menggunakan refleksi (yang memberikan Anda rincian dari setiap kelas di Jawa) daripada Anda salah bcoz refleksi adalah konsep yang sangat berguna dan jika mendapatkan detail dari setiap kelas adalah apa yang menyangkut Anda daripada yang dapat dilakukan dengan mudah dengan dekompiler apa pun ...
ANSHUL JAIN

2
Refleksi adalah konsep yang berguna dalam beberapa kasus, ya. Tapi 99,9% dari waktu saya melihatnya digunakan, saya melihatnya digunakan untuk meretas kesalahan desain.
Billy ONeal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.