Uygulamamda TestActivity adlı bir Activity sınıfım varsa, bu örnekte olduğu gibi sınıfını adına göre almanın bir yolu var mı:
Class<?> c = getClassByName("TestActivity");
Yanıtlar:
kullanmak forName yerine ..
bunun gibi bir şey ...
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
?
Class::forName
Bilinmeyen türde bir sınıf nesnesi almak için kullanabilirsiniz . Daktilo edilmiş bir sınıf almak istiyorsanız, şu şekilde Class::asSubclass
döndürülen sınıfta kullanabilirsiniz Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Elbette bir dizi farklı istisna türünü de ele almanız gerekecek. Yansıma ile uğraşırken her zamanki gibi.
Class.forName Üzerinde istisnalar var gibi gözüküyor. Bu, bu sorunu çözmek için yukarıdakileri genişletmek içindir.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
Benim de benzer bir gereksinimim vardı, arka uçtan gelen ekran ve aktivite haritalamasını içeren bir json'um vardı. Hem iOS hem de Android için json ortak olduğundan, json'a benzer terimler ekleyemedik Activity
, bu yüzden yaptığımız şey buydu
Herkes için json'da Activity
veya Viewcontrollers
basit isimler kullanın, ör. İçin HomeActivity
ve HomeViewController
json'da "Home" kullanacağız.
Uygulamada, json'u ayrıştırıyoruz ve etkinliği dinamik olarak elde etmek için aşağıdaki yardımcı program yöntemlerini yazdım
Sınıfın adını almak için (yani Evden geçersek geri döneceğiz com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Şimdi dizeden sınıf almak için
try {
val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
val fetchedClass = Class.forName(className)
val showDetailsIntent = Intent(context, fetchedClass)
context.startActivity(showDetailsIntent)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
}
Bu şekilde birden fazla sınıfı aynı yöntemle kolayca yönetebilirim. Bunu, her hücremin farklı bir aktiviteye gittiği bir geri dönüşüm görünümünde kullanıyorum.