2012-02-08 11 views
5

İnsanların kendi uygulamalarını yazmaları için soyut bir sınıf kullanmalarına izin veren bir uygulamam var. Bu uygulamaları bir dizinden .class-files olarak yüklerim. Ben bunları doğru yüklemek için sınıfları bulunmaktadır paketi belirtmeniz gerekir - Gördüğünüz gibiPaketleri belirtmeden sınıfları sınıftan yükle

File classDir = new File("https://stackoverflow.com/users/myproject/classes/"); 

URL[] url = { classDir.toURI().toURL() }; 
URLClassLoader urlLoader = new URLClassLoader(url); 

String filename; 
for (File file : classDir.listFiles()) { 
    filename = string.getFilenameWithoutExtension(file); 
    if (filename.equals(".") || filename.equals("..") || filename.startsWith(".")) 
     continue; 

AbstractClass instance = (AbstractClass)urlLoader 
    .loadClass("org.mypackage." + filename) 
    .getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class) 
    .newInstance(config, database, string)); 

    instance.doSomething(); 
} 

: Şu anda, bu çözümü var. paket atlama, bir

java.lang.NoClassDefFoundError: 
    MyClass (wrong name: org/mypackage/MyClass) 

hatası alıyorum.

Şimdi, bir mimari POV'den, tasarlanan diğer insanların sınıflarını yüklerken MY paketine derlenmesi gerektiği çok kötü tasarlanmış olduğunu düşünüyorum.

Bu yüzden size soruyorum: Dosya sistemini, içerdikleri paketi belirtmek zorunda kalmadan bir dosya yükleyebilir miyim?

+1

Paket yapısını yolunuzun altında bir klasör yapısı olarak tutabilirsiniz? Sınıfı yüklemeden önce paket adını yoldan oluşturun. –

+0

Bu bir ihtimal olurdu ... En azından iki sınıf aynı ada sahip olduğunda kendimi sıkmak zorunda kalmayacaktım ... başka bir açıdan güzel düşünce! :) –

+0

Deneyin ve işe yarayıp yaramadığını görün, eğer bazı kod örneklerini istiyorsanız bana bildirin! –

cevap

3

Evet; Bir arayüz uygulamak (veya bir açıklama kullanmak). Daha sonra, söz konusu belirli sınıfı yüklemek için herhangi bir sınıf tarama kitaplığı kullanın (bu konuda this one gibi çok fazla SO soruları vardır). "Java sınıfı tarama" veya "Java eklenti mekanizması" aranması yardımcı olacaktır.

Ayrıca Java Plugin Framework'u kullanmak ve biraz uğraşmaktan da kaçınmak isteyebilirsiniz. Artık bana ait olduğunu açıklamamasına rağmen, insanların hala onu kullandığını biliyorum.

+0

Bir arabirimin benim durumumda doğru olarak (semantik olarak konuşulur) çalışacağını düşünmüyorum. 'AbstractClass', uygulamada yalnızca geçersiz kılınmış (geçersiz kılma, wtf?) Yöntemlerini kullanan önceden tanımlanmış birçok işleve sahiptir. Bir arayüz buna izin vermiyor. –

+0

@FlorianPeschka ... aynı fark. –

+0

Yorumunuzu anlamıyorum. Ne farkı ne? –