2010-02-04 14 views
12

Scala için tam özellikli bir yansıtma API'sinin durumunu bilen var mı?Scala için Yansıtma API'si

Basit şeyler yapmak için Java'nın yansıma API'sini kullanabileceğinizi biliyorum, ancak bu Scala'nın dil özellikleriyle iyi çalışmıyor. Deneysel bir Scala Yansıtma API'sini tanımlayan bir interesting article buldum ama bildiğim kadarıyla hala deneysel. Ayrıca bir ScalaSigParser bahsettim ama bu oldukça düşük seviyede gibi görünüyor.

Bu, şu anda sadece Scala ile oynamaktan başka bir şey değil, bir meraktır. Bu sorunun cevabının Scala ile ilgilenen diğer kişiler için de faydalı olabileceğini düşündüm.

"JavaBean tarzı modeli için değişmez yedek" adlı parametreleri ifade ve @BeanProperty ek açıklama isteğe edilebilir
+0

Yansıma yapmak istediğiniz şey hakkında daha spesifik olabilir misiniz? Ad-managling ile yardımcı olmak için scala.tools.nsc içinde rutinleri kullanabilir ve bazı şeyler basitçe iyi yansıtmaz - sadece size yardım etmek için derlemeye ihtiyacınız vardır çünkü bunlar sadece mevcut yöntemleri çağırmak değildir. örneğin yeni bir kapatmaya ihtiyacınız varsa). –

+0

İlk olarak, parametrelerin sırası hakkında endişelenmenize gerek kalmayacak şekilde adlandırılmış parametrelerle sınıf örnekleri oluşturmanın iyi olacağını düşünmekteydim - bu, JavaBean stili deseni için değişmez bir yedek olabilir. Scala özellikleriyle ilgili olarak bir sınıfın yapısına bakmanın güzel olacağını düşünüyorum. yani. Bana bütün oyuncuları bul - birincil olanı bul - onu çağır. Ya da bu alandaki gibi sorulara cevap verin bir val veya var. Ayrıca, Java'nın API'sine geri dönmek yerine deyimsel Scala stilinde yapılan yansıma API'sini kullanmak güzel olurdu. Sadece fikirler .. –

+0

Çalışma zamanı veya değerlendirme stili deyimlerinde yöntemler eklemek gibi daha dinamik meta programlama özelliklerinden bazılarını düşünmüyordum - Java yansıma API'sinin Scala diline göre uyarlamanıza izin verdiğinden daha fazla satır. –

cevap

6

:

import reflect._ 
case class A(@BeanProperty val x: String, @BeanProperty val y : Int) 

A(x = "s", y = 3) 
A(y = 3, x = "s") 

ekleme yöntemleri (daha kesin: Yeni bir arayüzü tanımlayan) bir statik olarak tek mantıklı İstemci yeni yöntemler hakkında bilgi sahibi olursa ve arayüze karşı derleme yapabilirse, yazılan dil. Yapısal yazım istemcileriyle, bir nesnede bulunmayı bekledikleri yöntemleri tanımlayabilirler. Scala derleyici, yapısal türü çalışma zamanında başarısız olabilecek yansıma koduna dönüştürecektir.

type T = {def go(x : Int): Int } 
def y(any : Any) = any.asInstanceOf[T].go(2) 

class A{ 
    def go(x : Int) = x + 1 
} 
y(new A()) 
y(new {}) //this will fail 

Sen anında interpreter ile yeni sınıflar veya özelliklerini tanımlayabilir. Interpret yöntemi, Scala kodunu bayt koduna dönüştürür.

ScalaSigParser'dan daha önce bahsetmiş olduğunuzdan çok daha önce bahsetmiştiniz.

Hoşunuza giden özelliklerin henüz orada olmadığını düşünüyorum.

+0

Bu, yapısal türlerden dolayı değil, döküm nedeniyle çalışma zamanında başarısız olur. –