2013-04-12 14 views
17

Bazı eski kodlarda, birden çok istemci tarafından çağrılan statik bir yöntem var. Açıkçası onu geçersiz kılacak hiçbir seçenek yok veya bağımlılık enjeksiyonu ile davranışları değiştirebiliyorum. Mevcut sınıfı değiştirmem mümkün değil.Yansıma yoluyla yöntem davranışı nasıl değiştirilir?

Şimdi yapmak istediğim, yansımayı kullanarak davranışı değiştirmektir (bu yöntem - aynı imza ve dönüş türüyle).

mümkün mü? Yoksa, herhangi bir desen kalıbı kurtarır mı?

Teşekkürler!

DÜZENLEME: Ne değiştirebileceğime/değiştireceğime dair bazı karışıklıklar var. Mevcut bir sınıfı/yöntemi değiştiremiyorum - ancak projeye daha fazla sınıf ekleyebilirim. Mevcut sınıflarla yapabileceğim en iyi şey onlara açıklama eklenmesidir. Bu, mevcut kodda herhangi bir şeyi kırmaktan kaçınmak için yapılır - bu da büyük bir proje için testin tamamlandığı anlamına gelir.

DÜZENLEME 2: java.lang.Instrumentation Android için mevcut değil - ya da iyi bir uyum gibi geliyor!

+0

Neden yansıma? –

+3

Bunu değiştirmenize izin verilmiyor, ancak yansımayla değişiklik yapma izniniz var mı? Bu daha riskli görünüyor. – Keppil

+0

Sanırım bu bir bakım kâbusuna dönüşecek. Kod okuyan birine yalan söylüyor. Git ve o sınıfı değiştirmek için onay al. – SpaceTrucker

cevap

18

yansıma, sadece, şimdiki kod keşfetmek yöntem ve constuctors, değişim alanları değer şeylerin bu tür çağırabileceği kod davranışını değiştirmek için izin vermez, neyse ... Bir garip gereksinimi gibi

geliyor. Bir yöntemin davranışını değiştirmek isterseniz ASM gibi bir bytecode manipülasyon kütüphanesi kullanmanız gerekecektir. Ama bu ... size yardımcı olabilecek

Desenler çok kolay, muhtemelen iyi bir fikir olmaz:

  • sınıfı son değilse ve siz, müşterilerine değiştirmek varolan sınıfını genişletmek ve edebilirsiniz İstediğiniz davranışla yöntemi aşırı yükleyin. Düzenleme: Yalnızca yöntem statik değilse işe yarayacaktır!
  • boy programlama: Neyse

AspectJ kullanarak yöntemine önleyicilerin eklemek, yapılacak en mantıklı şey sadece kod daha karmaşık hale getirecek olan sınıfının, alternatif çözüm değiştirmek için bir yol bulmak olacak ve korumak için daha zor.

İyi şanslar.

+0

Statik olmanın yöntemi geçersiz kılınamaz. Düşüncenin alan değerlerini değiştirip değiştiremeyeceğini merak ediyorum, neden olmasın? – SlowAndSteady

+0

AOP’da yeniyim. Şimdi keşfetmek! – SlowAndSteady

+0

Elbette statik olan yöntem hakkında haklısınız. Cevabımı buna göre düzenledim. –

8

redefineClasses(ClassDefintion classDefinition) yöntemine sahip Instrumentation sınıfına bakabilirsiniz.

Yeniden tanımlama, yöntem gövdelerini, sabit havuzu ve öznitelikleri değiştirebilir. Yeniden tanımlama, alanları veya yöntemleri eklememeli, kaldırmamalı veya yeniden adlandırmamalı, yöntem imzalarını değiştirmemeli veya mirasını değiştirmemelidir.

Bu yardımcı olur umarım.

Referanslar: Javadoc

+0

Üzgünüm, bunu eklemeyi unutmuşsun Android. Bu sınıfa sahip değilim :( – SlowAndSteady