Reflection kullanımında problemler var mı?


49

Nedenini bilmiyorum, ama her zaman yansıma kullandığımda "hile yaptığımı" hissediyorum - belki de aldığımı bildiğim performanstan kaynaklanıyor olabilir.

Bir kısmım, kullandığınız dilin bir parçasıysa ve yapmaya çalıştığınız şeyi başarabiliyorsa, neden kullanmayacağınızı söylüyor. Diğer tarafım diyor ki, yansıma kullanmadan yapabileceğim bir yol olmalı. Sanırım duruma göre değişebilir.

Yansıma kullanırken dikkat etmem gereken olası konular nelerdir ve bunlar hakkında ne kadar endişelenmeliyim? Daha geleneksel bir çözüm bulmak için ne kadar çaba harcanması gerekir?


2
Sanırım dile ve çevreye bağlı. Bazıları onu destekliyor, hatta teşvik ediyor. Bazen Java'da çalışırken daha iyi yansıtma desteği diledim.
SinirliFormsDesigner'la

18
Eh, sanırım "hile yansıması" ile geçerli bir kullanımı arasında dinlenmek zor değil: Özel üyeler incelendiğinde ya da özel yöntemler çağırmak için kullandığınızda (arayüzler etrafında çalışmak için), o zaman muhtemelen hile yapmak çok olasıdır. Hakkında bilgi sahibi olmadığınız türlerle etkileşime girmek için kullandığınızda, muhtemelen sorun yok (veri bağlama, proxy'ler vb.).
Şahin

1
Hangi dili kullanıyorsun Brainfuck'un yansıması yoktur ve Python sadece farklıdır.
Meslek

1
Ayrıca, yansıtma yoluyla neden özel yöntemlere erişime izin verildiğini de anlamadım. Sezgime göre yasaklanmalı.
Giorgio

3
Böyle kötü konuşulan bir sorunun, herhangi bir düzenlemeye gerek kalmadan 27 galibiyet aldığına inanmak zor.
Aaron,

Yanıtlar:


48

Hayır, hile yapmak değil - bazı programlama dillerinde sorunları çözmenin bir yoludur.

Şimdi, genellikle en iyi (en temiz, en basit, bakımı en kolay) çözüm değildir. Daha iyi bir yol varsa, bunu gerçekten kullanın. Ancak, bazen yoktur. Ya da varsa, çok daha karmaşıktır, birçok kod çoğaltması içerir, bu da onu olanaksız kılar (uzun vadede bakımını zorlaştırır).

Mevcut projemizden iki örnek (Java):

  • Test araçlarımızdan bazıları, XML dosyalarından yapılandırmayı yüklemek için yansıma kullanır. Başlatılacak sınıfın belirli alanları vardır ve config loader fieldX, sınıftaki uygun alana adlandırılmış XML öğesini eşleştirmek ve ikincisini başlatmak için yansıma kullanır . Bazı durumlarda, anında tanımlanmış özelliklerden basit bir GUI iletişim kutusu oluşturabilir. Yansıma olmazsa, bu birkaç uygulamada yüzlerce kod satırı alır. Böylece yansıma çok kolay ve hızlı bir şekilde basit bir araç oluşturmamıza yardımcı oldu ve önemsiz kısımlara odaklanmamızı sağladı (web uygulamamızı regresyon test ederek, sunucu kayıtlarını analiz ederek vs.) alakasız değil.
  • Eski web uygulamamızın bir modülünün, verileri DB tablolarından Excel sayfalarına aktarması ve geri vermesi gerekiyordu. Çoğunlukla aynı olmadığı, çoğunun aynı olduğu, çoğunun kod içerdiği birçok çoğaltılmış kod içeriyordu. Bunlardan bazıları hata içeriyordu. 5K - 2,4K'nın altında, kodu daha sağlam ve sürdürmek veya uzatmak için daha kolay hale getirir. Şimdi bu modül bizim için bir sorun olmaktan çıktı - yansımanın makul kullanımı sayesinde.

Sonuç olarak, herhangi bir güçlü araç gibi, yansıma da ayağınızı vurmak için kullanılabilir. Ne zaman ve nasıl kullanacağınızı (kullanmayacağınızı) öğrenirseniz, aksi takdirde zor olan sorunlara zarif ve temiz çözümler getirebilir. Kötüye kullanırsanız, basit bir sorunu karmaşık ve çirkin bir kargaşaya dönüştürebilirsiniz.


8
+1 Yansıtma, dönüştürme nedenlerinden dolayı ara nesneleriniz olduğunda, veri içe / dışa aktarmada inanılmaz derecede faydalıdır.
Ed James

2
Ayrıca, veri odaklı uygulamalarda da inanılmaz derecede faydalıdır - büyük bir yığın yığını kullanmak yerine, if (propName = n) setN(propValue);(yani) XML etiketlerinizi kod özelliklerinizle aynı adlandırabilir ve bunlar üzerinde bir döngü çalıştırabilirsiniz. Bu yöntem ayrıca daha sonra özellikler eklemeyi çok daha kolaylaştırır.
Michael K

Yansıma, FluentNHibernate gibi Fluent arayüzlerinde yoğun olarak kullanılır.
Scott Whitlock

4
@Michael: Sınıftaki bu özelliklerden birini yeniden adlandırmaya karar verene ve kodunuzun patladığını tespit edinceye kadar. Programınızın ürettiği şeylerle karşılaştırılabilirliği korumanız gerekmiyorsa, sorun değil, ama bunun çoğumuz olmadığını sanıyorum.
Billy ONeal

1
@Billy, seninle çelişmek istemedim, yazdıklarına katılıyorum. Her ne kadar, getirdiğin örnek IMHO’ya “genel arayüzleri değiştirmekten kaçın” genel kuralının bir küçük harfiydi.
Péter Török

37

Hile yapmak değil. Ancak, üretim kodunda en azından aşağıdaki nedenlerden dolayı genellikle kötü bir fikirdir:

  • Derleme zamanı türü güvenliğini kaybedersiniz - derleyicinin derleme zamanında bir yöntemin kullanılabilir olduğunu doğrulaması gerekir. Yansıma kullanıyorsanız, çalışma zamanında yeterince iyi test etmezseniz son kullanıcıları etkileyebilecek bir hata alırsınız. Hatayı yakalasanız bile, hata ayıklamak daha zor olacaktır.
  • Yeniden aktive edildiğinde hatalara neden olur - ismine göre bir üyeye erişiyorsanız (örneğin, kodlanmış bir dize kullanarak), bu durumda çoğu kod yeniden düzenleme aracı tarafından değiştirilmez ve anında bir hata olabilir. izini sürmek zor.
  • Performans yavaştır - çalışma zamanındaki yansıma, statik olarak derlenmiş yöntem çağrıları / değişken aramalarından daha yavaş olacaktır. Yalnızca zaman zaman yansıma yapıyorsanız, o zaman önemli olmaz, ancak bu saniyede binlerce veya milyon kez yansıma yoluyla arama yaptığınız durumlarda performans darboğazı olabilir. Bir keresinde sadece tüm yansımayı ortadan kaldırarak bazı Clojure kodlarında 10x hız kazandım, yani evet, bu gerçek bir konudur.

Yansıma kullanımını aşağıdaki durumlarla sınırlandırmanızı öneririm:

  • En basit çözüm olduğunda hızlı prototipleme veya "atma" kodu için
  • İçin hakiki yansıma kullanım durumları kullanıcı alanları / çalışma zamanında keyfi bir nesnenin yöntemlerini incelemesini sağlar örneğin IDE kalıp.

Diğer tüm durumlarda, yansımayı önleyen bir yaklaşım bulmanızı öneririm. Bir arayüzün uygun yöntem (ler) ile tanımlanması ve yöntem (ler) i çağırmak istediğiniz sınıflar kümesinde uygulanması genellikle çoğu basit durumu çözmek için yeterlidir.


3
+1 - yansıma için birkaç kullanım durumu vardır; ama çoğu zaman programcıların onu kullandıklarını görüyorum, ciddi kusurlu tasarımları kağıdına alıyorlar. Arayüzleri tanımlayın ve yansıma bağımlılığını ortadan kaldırmaya çalışın. Tıpkı GOTO gibi, kullanımları var, ancak çoğu iyi değil. (Bazıları elbette iyidir)
Billy ONeal

3
Yukarıdaki hususların favori diliniz için geçerli olabileceğini veya uygulanmayabileceğini unutmayın. Örneğin, Smalltalk'te yansıma hız cezası yoktur ve hesaplama tamamen geç kaldığından derleme zamanı güvenliğini de kaybetmezsiniz.
Frank Shearar

D'deki yansımanın bahsettiğiniz dezavantajı yoktur. Bu yüzden, bazı dillerde uygulamayı daha fazla reddetmekle suçladığınızı iddia ediyorum. Smalltalk hakkında fazla bir şey bilmiyorum, ama @ Frank Shearar'a göre, sakıncaları da yok.
deadalnix

2
@deadalinx: Hangi dezavantajı belirtiyorsunuz? Bu cevapta birkaç tane var. Performans sorunu dile bağlı olan tek şey.
Billy ONeal

1
İkinci sorunun - yeniden yapılanma sırasında ortaya çıkan hataların - muhtemelen en ciddi olduğunu eklemeliyim. Özellikle, belirli bir adı olan bir şeye güvenmek, o şeyin adı değiştiğinde anında kırılır. Bu nedenle ortaya çıkan hatalar, çok dikkatli olmadığınız sürece, bilgi vericiden daha az olabilir.
Frank Shearar

11

Yansıma başka bir meta programlama biçimidir ve bugünlerde çoğu dilde gördüğünüz tür tabanlı parametreler kadar geçerlidir. Yansıtma, güçlü ve geneldir ve yansıtıcı programlar, yüksek seviyede bir bakım yapılabilirlik (doğru kullanıldığında, elbette) ve tamamen nesne yönelimli veya prosedürel programlardan daha fazladır. Evet, bir performans bedeli ödersiniz - ancak birçok durumda, hatta çoğu durumda daha sürdürülebilir olan daha yavaş bir programa memnuniyetle giderim.


2
+1, bu bana yansımanın ne olduğunu anlamama yardımcı oluyor . Ben bir C ++ programcisiyim ve bu yüzden asla gerçek bir yansimayim. Bu yardımcı olur. (Her ne kadar benim görüşüme göre, Yansıma dilindeki bir eksikliğin giderilmesine yönelik bir girişim gibi
gözüksem de

4
Yeniden performans - bazı durumlarda, tam performans kodunu geri yazmak için yansıma API'sini kullanabilirsiniz. Örneğin, .NET'te IL'yi geçerli uygulamaya yazabilirsiniz - bu nedenle "yansıma" kodunuz diğer herhangi bir kod kadar hızlı olabilir (if / else / whatever'ın çoğunu kaldırabilirsiniz hariç) kesin kuralları anladım)
Marc Gravell

@greyfade: Bir anlamda, şablonlar sadece derleme zamanı yansıması yapıyor. Çalışma zamanında bunu yapabilmek, yeniden derlenmek zorunda kalmadan uygulamada güçlü yeteneklerin oluşturulmasına izin verme avantajına sahiptir. Beklentinizden çok daha uzun bir süre sonra kabul edilebilir bir değiş tokuş olan esneklik için performans ticareti yapıyorsunuz (C ++ geçmişiniz göz önüne alındığında).
Donal Fellows

Cevabını anlamıyorum. Yansıma kullanan programların, program gerektirmeyen programlara göre daha bakımsız olduğunu, performansa ihtiyaç duyulmadığında yansıma nesne yönelimli ve prosedürel programları desteklemesi gereken üstün bir programlama modeli olduğunu söylüyor gibi görünüyorsunuz .
DavidS

8

Elbette hepsi, neyi başarmaya çalıştığınıza bağlı.

Örneğin, ne tür bir medyayı (MP3 dosyaları veya JPEG dosyaları) denetleyeceğinizi belirlemek için bağımlılık enjeksiyonunu kullanan bir medya denetleyicisi uygulaması yazdım. Kabuğun, her tür için ilgili bilgileri içeren bir ızgara göstermesi gerekiyordu, ancak ne göstereceği konusunda hiçbir bilgisi yoktu . Bu, bu tür ortamları okuyan montajda tanımlanır.

Bu nedenle, gösterilecek sütun sayısını ve türlerini ve adlarını almak için yansıma kullanmak zorunda kaldım, böylece ızgarayı doğru ayarlayabilecektim. Ayrıca, başka bir kod veya yapılandırma dosyasını değiştirmeden enjekte edilen kütüphaneyi güncelleyebileceğim (veya yeni bir tane oluşturabileceğim) anlamına geliyordu.

Diğer tek yol, kontrol edilen medya türünü değiştirdiğimde güncellenmesi gereken bir konfigürasyon dosyasına sahip olmaktı. Bu, başvuru için başka bir başarısızlık noktası getirecekti.


1
“Elbette hepsi, neyi başarmaya çalıştığınıza bağlı.” +1
DaveShaw

7

Bir kütüphane yazarıysanız ve bu nedenle gelen veriler üzerinde herhangi bir etkiniz yoksa yansıma harika bir araçtır . Yansıma ve meta programlama bir arada, kütüphanenizin kod üretme vb. Çemberlerinden atlamak zorunda kalmadan, keyfi arayanlar ile sorunsuz çalışmasına izin verebilir.

Yine de uygulama kodundaki yansımadan caydırmaya çalışıyorum ; Uygulama katmanında farklı metaforlar kullanmalısınız - arayüzler, soyutlama, kapsülleme vb.


Bu tür kütüphanelerin kullanımı genellikle zor ve en iyi şekilde engelleniyor (ör. Bahar).
Sridhar Sarnobat

@Sridhar, hiç seri hale getirme API kullanmadınız mı? Veya herhangi bir ORM / micro-ORM?
Marc Gravell

Onları kendi seçimim dışında kullandım. Ne yapmam gerektiği söylenmediyse, kaçınılması gereken sorunlara karşı moral bozuyordu.
Sridhar Sarnobat

7

Yansıma geliştiriciler için araçlar oluşturmak için harika.

Yapım ortamınızın kodu kontrol etmesine ve potansiyel olarak kodu denetlemek / initlemek için doğru araçları üretmesine olanak tanıdığından

Genel bir programlama tekniği olarak faydalı olabilir, ancak çoğu insanın düşündüğünden daha kırılgandır.

Yansıma için gerçekten geliştirme kullanımlarından biri (IMO), genel bir akış kitaplığını yazmayı çok basit hale getirmesidir (sınıf açıklamanız hiç değişmediği sürece (o zaman çok kırılgan bir çözüm olur)).


Gerçekten, Bahar "çoğu insanın hayal ettiğinden daha kırılgan" dır.
Sridhar Sarnobat

5

Yansıma kullanımı, büyük bir farkındalıkla kullanılmadığı takdirde OO dillerinde genellikle zararlıdır.

StackExchange sitelerinde gördüğüm kaç kötü soruyu sayımı kaybettim.

  1. Kullanılan dil OO
  2. Yazar, hangi tür nesnenin geçtiğini bulmak ve ardından yöntemlerinden birini çağırmak ister.
  3. Yazar, yansımanın yanlış bir teknik olduğunu kabul etmeyi reddediyor ve bunu “bana nasıl yardımcı olacağımı bilme” olarak işaret eden herkesi suçluyor.

İşte olan tipik örnekleri.

OO noktasının çoğu

  1. Bir yapı / kavramı, şeyle birlikte nasıl idare edeceğini bilen fonksiyonları gruplandırıyorsunuz.
  2. Kodunuzun herhangi bir noktasında bir nesnenin türü hakkında, hangi fonksiyonlara sahip olduğunu bilmek ve bu fonksiyonların kendilerine özgü sürümünü çağırmasını istemek için yeterince bilginiz olmalıdır.
  3. Her bir fonksiyon için doğru giriş tipini belirleyerek ve her bir fonksiyonun alakalı olandan daha fazla bir şey bilmediğini (ve daha fazlasını yapmadığını) yaparak önceki noktanın doğruluğunu garanti edersiniz.

Kodunuzdaki herhangi bir noktada, 2. nokta geçirilmiş bir nesne için geçerli değilse, bunlardan biri veya daha fazlası doğru

  1. Yanlış giriş besleniyor
  2. Kodunuz kötü yapılandırılmış
  3. Ne yaptığın hakkında hiçbir fikrin yok.

Zayıf yetenekli geliştiriciler bunu anlamıyorlar ve kodlarının herhangi bir bölümünde herhangi bir şeyden geçilebileceklerine ve (kodlanmış) bir olasılıklar kümesinden istediklerini yapabildiklerine inanıyorlar. Bu salaklar yansıması çok kullanırlar .

OO dilleri için, yansıma sadece meta aktivitesinde (sınıf yükleyicileri, bağımlılık enjeksiyonu vb.) Gerekli olmalıdır. Bu bağlamlarda, yansıma gereklidir çünkü iyi ve meşru bir nedenden dolayı hakkında hiçbir şey bilmediğiniz kodun manipülasyonuna / yapılandırmasına yardımcı olmak için genel bir hizmet sağlıyorsunuz. Neredeyse başka bir durumda, yansıma için ulaşıyorsanız, o zaman yanlış bir şey yapıyorsunuzdur ve kendinize bu kod parçasının kendisine aktarılan nesne hakkında neden yeterince bilgi sahibi olmadığını sormanız gerekir.


3

Yansıtılan sınıfların etki alanının iyi tanımlandığı durumlarda alternatif, çalışma zamanında yansıma kullanmak yerine kod üretmek için diğer meta verilerle birlikte yansıma kullanmaktır. Bunu FreeMarker / FMPP kullanarak yapıyorum; Aralarından seçim yapabileceğiniz birçok araç var. Bunun avantajı, kolayca hata ayıklanabilen "gerçek" kodla bitmenizdir.

Duruma bağlı olarak, bu çok daha hızlı bir kod yapmanıza yardımcı olabilir - ya da sadece çok fazla kod şişmesi. Yansıma dezavantajlarından kaçınır:

  • derleme zamanı tür güvenliği kaybı
  • refactoring nedeniyle oluşan hatalar
  • daha yavaş performans

daha önce bahsedilen.

Yansıma hile yapmak gibi geliyorsa, bunun nedeni emin olmadığınız pek çok tahminde bulunmanız olabilir ve bağırsaklarınız bunun riskli olduğunu uyarıyor olabilir. Karşı karşıya kalabileceğiniz gerçek dünya sınıflarının tüm tuhaflıklarını ve özel durumlarını tanımlayabileceğiniz, kendi meta verilerinizle yansıtılan meta verileri geliştirmek için bir yol sağladığınızdan emin olun.


2

Aldatma değildir, ancak herhangi bir araç gibi, çözülmesi amaçlanan şey için kullanılmalıdır. Yansıma, tanımı gereği, kodu kod aracılığıyla incelemenize ve değiştirmenize olanak sağlar; Yapmanız gereken şey buysa, yansıma işin aracıdır. Yansıma tamamen meta-kodla ilgilidir: Kodu hedef alan kod (verileri hedef alan normal kodun aksine).

İyi yansıma kullanımına bir örnek, genel web hizmeti arayüz sınıflarıdır: Tipik bir tasarım, protokol uygulamasını yük taşıma fonksiyonundan ayırmaktır. Öyleyse Tyükünüzü uygulayan bir sınıf (diyelim ) ve protokolü ( P) uygulayan başka bir sınıfınız var . Toldukça basittir: yapmak istediğiniz her arama için, ne yapması gerekiyorsa onu yapan bir yöntem yazmanız yeterlidir. PAncak, web servis aramalarını metot aramalarına eşlemek gerekir. Bu eşlemeyi jenerik yapmak arzu edilir, çünkü fazlalıktan kaçınır ve Pyeniden kullanılabilir hale getirir . Reflection, sınıfın Tçalışma zamanında kontrol edilmesi ve Pherhangi bir sınıf derleme bilgisi olmadan web servis protokolü üzerinden geçirilen dizgelere dayanarak yöntemlerini çağırmanın yolunu sunar.T. 'Kod hakkında kod' kuralını kullanarak, bir sınıfın Pkodunun Tverilerinin bir parçası olarak sınıfta olduğu iddia edilebilir .

Ancak.

Yansıma ayrıca, dilin tip sisteminin kısıtlamalarını aşmanız için araçlar sunar - teorik olarak, tüm parametreleri tür olarak geçirebilir objectve yöntemlerini yansımalar yoluyla çağırabilirsiniz. Güçlü statik yazma disiplini uygulaması beklenen dil Voilà, artık geç bağlayıcılı dinamik olarak yazılmış bir dil gibi davranıyor, sadece sözdiziminin çok daha karmaşık olduğunu gösteriyor. Şimdiye dek gördüğüm bu tür bir örüntüün her bir örneği kirli bir hack olmuş ve her zaman dilin tip sistemindeki bir çözüm mümkün olacaktı ve her bakımdan daha güvenli, daha zarif ve daha verimli olacaktı. .

İlgili olmayan çeşitli veri kaynağı türlerine verilere bağlı olabilen GUI kontrolleri gibi birkaç istisna vardır; Verilerinizin belirli bir arabirim oluşturmasını zorunlu kılar, böylece verileri gerçekçi bir şekilde bağlayabilirsiniz, programcının her veri kaynağı türü için bir adaptör uygulaması yoktur. Bu durumda, veri kaynağının türünü tespit etmek için yansıma kullanmak ve veri bağlanmasını ayarlamak daha faydalı bir seçimdir.


2

Reflection ile ilgili yaşadığımız bir problem, karışıma Obfuscation eklememizdir . Tüm sınıflar yeni isimler alır ve aniden bir sınıfa veya ismine göre yükleme işlemi durur.


1

Tamamen bağlıdır. Yansıma olmadan yapmak zor olacak bir şeyin bir örneği ObjectListView'ü çoğaltmak olacaktır . Ayrıca anında IL kodu oluşturur.


1

Yansıma, kongre tabanlı sistemler oluşturmanın birincil yöntemidir. MVC çerçevelerinin çoğunda yoğun olarak kullanıldığını görünce şaşırmam. ORM'lerde önemli bir bileşendir. Muhtemelen, zaten her gün onunla oluşturulmuş bileşenleri kullanıyorsun.

Böyle bir kullanımın alternatifi, kendi dezavantajları olan konfigürasyondur.


0

Yansıma, pratik olarak başka türlü yapılamayacak şeyleri başarabilir.

Örneğin, bu kodu nasıl optimize edeceğinizi düşünün:

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;
}

İç döngünün ortasında pahalı bir test sorunu var, ancak ayıklamak, her bir operatör için döngünün bir kez yeniden yazılmasını gerektiriyor. Yansıma, döngüyü bir düzine kez tekrar etmeden (ve böylece bakımdan ödün vermeden), bu testi çıkartarak aynı performansı elde etmemizi sağlar. Sadece anında ihtiyacınız olan döngüyü oluşturun ve derleyin.

Ben var aslında bu optimizasyon yapılır biraz daha bir durumun karmaşık olmasına rağmen, ve sonuçlar şaşırtıcı idi. Performansta ve daha az kod satırında büyüklük iyileştirme sırası.

(Not: Başlangıçta bir karakter yerine bir Func ile eşdeğerde geçmeyi denedim ve biraz daha iyiydi, ancak neredeyse 10x yansıma elde edilmedi.)


1
En iyi optimizasyon yerine bir functor geçmek. Büyük olasılıkla çalışma zamanında JIT derleyicisi tarafından satır içi işaretlenir ve yansımadan daha fazla korunur.
Billy ONeal

Bu daha sürdürülebilir olurdu ve ilk önce denemeliyim, ama yeterince hızlı değildi. JIT kesinlikle bunu desteklemiyordu, çünkü muhtemelen benim durumumda gerçekleştirilecek işlemler üzerinde ikinci bir iç döngü vardı.
Craig Gidney

Ayrıca, sahip olduklarınızın gerçekten kendini değiştiren bir kod olduğunu ve bunun gerçekten bir yansıma olmadığını işaret ediyorum. Biri, yansımayı destekleyen çoğu dilde yansıma API'leri yoluyla erişir, ancak yansıması desteklemeyen dillerde de yapılabilir (örneğin, C ++ 'da mümkün olabilir)
Billy ONeal

Standart 'yapısal eşitlik' örneğinden kaçınmak istedim. Yansıtma, kendi kendini değiştiren kod için gerekli değildir, ancak kesinlikle yardımcı olur.
Craig Gidney

Pek sayılmaz. Bunu yansıtma dışı dillerde yapabilirsiniz.
Billy ONeal

-2

Hile yapması mümkün değil… Aksine, uygulama sunucularına, kullanıcı tarafından yapılan sınıfları seçtikleri adla çalıştırmaları için güçlendiriyor, böylece kullanıcıya hile yapmıyor, esneklik sağlıyor.

Ve eğer herhangi bir .class dosyasının kodunu görmek istiyorsanız (Java'da), o zaman ücretsiz olarak kullanılabilecek birçok kod çözücü vardır!


Ayrışma, yansıma özelliği değildir.
Billy ONeal

evet, öyle değil… Ama demek istediğim, eğer yansıma kullanırken (size java'daki herhangi bir sınıfın ayrıntılarını sağlayan) hile yapmak yanlışsa, bcoz yansımasının çok yararlı bir kavram olduğunu ve herhangi birinin ayrıntılarını almanın Sınıf, sizi ilgilendiren şeydir, herhangi bir decompiler ile kolayca yapılabilir ...
ANSHUL JAIN

2
Yansıma bazı durumlarda faydalı bir kavramdır, evet. Ancak, kullanıldığını gördüğüm zamanın% 99,9'u bir tasarım hatasını düzelttiğini görüyorum.
Billy ONeal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.