2016-04-01 13 views
1

Bir nesneyi dinamik olarak yüklemek ve yeni örnekler oluşturmak ve yayınlar çalıştırmak için kullanmak için bir kod oluşturmaya çalışıyorum. Yeni yüklenen sınıftan şu yöntemi kullanarak bir örnek oluşturabilirim: myClass.newInstance();. Ama bunu bir tür olarak kullanamıyorum. Örneğin: myClass myObj = new myClass(); Çalışmıyor. Bir şekilde gerçekleştirmek mümkün mü? Derleme zamanında MyIn bilmediğimizeBir sınıfı dinamik olarak yüklemek ve onu bir tür olarak kullanmak mümkün mü?

URL classUrl; 
classUrl = new URL("file:///C:/classes/"); 
URL[] classUrls = { classUrl }; 
URLClassLoader ucl = new URLClassLoader(classUrls); 
Class c = ucl.loadClass("Operation"); 
Class MyIn = ucl.loadClass("MyInter"); 
Object o = c.newInstance(); //IT WORKS 
System.out.println(((MyIn) o).sum(2, 4)); //IT DOES NOT WORK. Message: MyIn cannot be resolved to a type 
+0

Derleme süresinden sonra yüklediğinizde derleme zamanında neden sınıfı kullanamadığınızı mı soruyorsunuz? –

+0

Haklısın ama dinamik olarak yapmanın bir yolunu yapmak istiyorum, dinamik olarak yüklemek yerine onu dinamik olarak yüklemek yerine –

+0

'MyIn 'kodunuzda değişken bir ad ve daha sonra' o 'arayüz türüne çevirmeyi deneyin MyIn' - aynı karakterleri buraya not edin! 'MyIn' değişkeninin ismini myIn' gibi daha tipik bir Java’ya değiştirin. Ayrıca, 'MyIn' örneğini kullanarak: 'MyIn örneğim = MyIn.getClass(). Cast (o); 've bunu uygulamanızda başka herhangi bir dinamik olarak yüklenmemiş olan' MyIn 'uygulamasında kullanabilirsiniz. –

cevap

5

, değil sadece, aynı zamanda sizin gibi, sınıf örneğini, bunlarla yansıma kullanmak gerekir:

Bu benim yapmaya çalışıyordu kodudur yöntemleri çağırmak. çizgisinde

şey:

MyIn.getDeclaredMethod("sum",Integer.TYPE,Integer.TYPE).invoke(o,2,4); 

örnek https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

+1

Her ikisi de derleme zamanında bilinen ve dinamik olarak yüklenen sınıf tarafından uygulanan bir arabirimde bulunuyorsa, yöntemlerini doğrudan arayabilirsiniz. –

+0

MyIn, yüklemeye çalıştığım bir arabirimdir. O yüzden ben de oyuncu kadrosuna girmeye çalışıyorum. Internface, 'sum' yönteminin bir beyanına sahiptir.Bana verdiğin satırı çalıştırma, yeni bir hata görüntüler: Yakalanan istisna: java.lang.NoSuchMethodException: MyEx.sum() –

+0

getDeclaredMethod için API'ye bakın, parametre türlerine gereksinim duyar. –

1

doğrudan size çalışma anında daha sonra yüklemek derleme sırasında bir sınıf kullanamaz için bkz.

Ancak, yüklenen sınıfları tarafından uygulanan bir veya daha fazla arayüzleri doğrudan çalışabilir. Tipik olarak ara yüzlerin kendisi, hem yükleme kodunun hem de yüklenen kodun derleme zamanı sınıf yoluna dahil edilir.

Paylaşılan arabirimler, derleme zamanında beklenen etkileşimi tanımlar. Yüklenen kod, çalışma zamanında bir davranış tanımlar.

Örneğin, bu dinamik olarak yüklenen sınıf yükleyebilir:

public class Operation implements MyInterface { ... } 

Sonra paylaşılan arayüz üzerinden etkileşimde:

Class c = ucl.loadClass("mypackage.Operation"); 
Object o = c.newInstance(); //IT WORKS 
MyInterface operation = (MyInterface) o; 

Şimdi paylaşılan aracılığıyla yöntemlerle doğrudan etkileşime girebilir arayüz.

System.out.println(operation.sum(2, 4)); 

Yapıcılar

For example: myClass myObj = new myClass(); It doesn't work. Is it possible to perform somehow?

Sen adlı kurucular dinamik yüklenen kod ile fabrika oluşturabilirsiniz. Fabrika ayrıca ortak bir arayüz uygulayacaktır.

Class cFactory = ucl.loadClass("mypackage.MyFactory"); 
MyFactoryInterface factory = (MyFactoryInterface) cFactory.newInstance();  
MyInterface myObj = factory.makeOperation(); 
+0

Andy, cevap için teşekkürler. Bu arayüzü projeme dahil etmeden nasıl kullanabilirim? Çünkü teknik olarak, kodum yeni yüklenen sınıfımın "MyInterface" adlı bir arabirim oluşturduğunu bilmiyor, değil mi? Kodum, orada bildirdiğimde bu etkileşimi göremeyecektir. Yüklenen bu sınıf ayrıca dinamik olarak derlendi. Ve üretilen şey sadece .class dosyasıydı. 'Operation.java' dinamik olarak derledim ve şimdi 'Operation.java' ve 'Operation.class' klasörümde var. Operation.class'ı alıyorum ve yüklüyorum. Ama Operasyonun uyguladığı 'MyInter' arayüzünü nasıl alabilirim? –

+1

@ AraújoFilho Arayüzü “Operation” yazdıkça arayüzü açıkladığınızdan, arayüzün başka bir yerde kullanılabilir olması gerekir, “Operasyon” bile derleme yapmamalı. Genellikle (plug-in-able uygulamalarında olduğu gibi), dinamik olarak yüklenmiş sınıfların en azından uygulanması gereken dinamik olarak yüklenmiş sınıfların çağrılmasına izin vermek için ana kodda hali hazırda var olan bir arayüz var, dinamik olarak yüklenmiş sınıfları yürütmek zor olabilir –

+0

Thx @RomanVottner. Şimdi anladım. Yani, bir arabirimi dinamik olarak yüklemek için bir yolu yok mu? –

İlgili konular