2012-02-19 23 views
6

Javassist’e yeni başlayan biriyim ve bununla ilgili bazı dersleri okudum.Varolan bir sınıfı, javasist kullanarak varolan bir sınıfa ekleyebilir miyiz?

Her yönteme bayt kodu enjeksiyonu yapmam gerektiğinden, yöntemin çıkışına girmeden önce veya girmeden önce bazı istatistikler alın. CtField türü varsayılan olarak yalnızca ilkel türü içeren

CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(CtClass.intType, "z", point); 
point.addField(f); 

Ama

, biz yeni bir alan ekleyebilirsiniz: Online javassit öğretici sayesinde

, biz varolan sınıfa yeni bir alan yaratabilir bulmak türünün ilkel olmayan türü, örneğin ArrayList?

Sınıfı java.util.ArrayList içe aktarmadığından, yeni ArrayList alanını varolan sınıfa ekleyebilirsem, derleme hatasına neden olur mu?

cevap

6

Evet, ilkel olmayan alanlar ekleyebilirsiniz. Sadece sınıf için ClassPool ile sınıfın bir tutamaç almanız gerekir. Kullanmak istediğiniz sınıfın tam nitelendirilmiş adını gerektiğini unutmayın:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList"); 
CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(arrListClazz, "someList", point); 
point.addField(f); 
+0

Teşekkür yukarıdaki kodu, nokta sınıfına new ArrayList üye somelist ekleyin ama mesele sınıfta biz değil mi' anlamına gelir t java.util.ArrayList dosyasını içe aktarın, bu derleme hatasına neden olur mu? – LifeOnCodes

+0

Eh, gerçek bir İngilizce dil dizesi değil, java.util.ArrayList alanını temsil eden *** bytecode *** ekleyerek. İçe aktarma ifadeleri, derlenmiş sınıf dosyasında görünmeyen derleyici direktifleridir. Bu arada, ClassPool'daki sınıfları ararken neden tam nitelikli bir ad (FQN) kullanmanız gerekiyor. – Perception

+0

Çok teşekkürler, anlıyorum. Sanırım bayt kodunu incelemek için biraz zaman harcamalıyım. Bir soru daha, umarım bana yardımcı olabilirsiniz, bazıList memeber'in ArrayList someList gibi jenerik bir tip olması mümkün mü? – LifeOnCodes

İlgili konular