Nasıl Java içinde SINIF değiştirmek istiyor musun?
Nasıl Java süreci içinde Java bir sürecin SINIF değiştirir misin?
< / ^ hr .
"Bunu Neden yapmak istiyorsun?" diye siz sormadan Bunu birazdan açıklayacağım.
Ne zaman bir Clojure ÇOĞALTMA çalıştığı ortak gerek kavanozlar sizin SINIF için bir yük Clojure kaynak dosya ve yapmak istiyorum, onsuz olması için yeniden Clojure kendisi (ki gerçekten bir seçenek kullanırken, üzerinde dev Emacs).
Sebep bu ama bu soru-garip-bazı dil olarak etiketli-garip-bir Editörün istiyorum ve cevabı olabilir Java geliştiricilerin çoğunluğu tarafından gözardı etmiyorum.
CEVAP
Bazı genel yorum:
(iş garantili, taşınabilir bir şekilde, aşağıya bakınız) sistem sınıf değiştiremezsiniz. Bunun yerine, yeni bir ClassLoader tanımlamak gerekir.
ClassLoaders hiyerarşik bir şekilde çalışır... yani sınıf statik bir referans X kılan herhangi bir sınıf X, ya da çocuk ClassLoader aynı ClassLoader yüklü olması gerekir. Eğer daha önce yapmış olsam bile herhangi bir özel ClassLoader kod sistemi ClassLoader tarafından yüklendi düzgün bağlantı yapmak için kullanabilirsiniz. Bulma, ekstra kodu için ayrıca özel ClassLoader çalıştırmak için Ana Uygulama kodunuzu ayarlamak gerekir.
(Bu söyleniyor, cracked-all extending the URLClassLoader
yorumlarını bu örnekte bahseder)
Ve kendi ClassLoader yazılı değil düşünün, ama sadece URLClassLoader yerine kullanabilirsiniz. Bir url ile bir URLClassLoader oluşturundeğilüst classloaders url.
URL[] url={new URL("file://foo")};
URLClassLoader loader = new URLClassLoader(url);
ClassLoader currentThreadClassLoader
= Thread.currentThread().getContextClassLoader();
// Add the conf dir to the classpath
// Chain the current thread classloader
URLClassLoader urlClassLoader
= new URLClassLoader(new URL[]{new File("mtFile").toURL()},
currentThreadClassLoader);
// Replace the thread classloader - assumes
// you have permissions to do so
Thread.currentThread().setContextClassLoader(urlClassLoader);
Eğer kabul Jvm'ler sistemi classloader bir URLClassLoader (doğru olmayabilir için tüm Jvm'ler) kullanabilirsiniz yansıması da aslında değiştirme sistemi sınıf... (ama bu bir hack;)):
public void addURL(URL url) throws Exception {
URLClassLoader classLoader
= (URLClassLoader) ClassLoader.getSystemClassLoader();
Class clazz= URLClassLoader.class;
// Use reflection
Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(classLoader, new Object[] { url });
}
addURL(new File("conf").toURL());
// This should work now!
Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");
Nasıl bir sınıf içinde bir Java paketi...
Java sınıf yolu içinde birden fazla ka...
Nasıl&; derleme quot&; Java sınıf dosy...
Yüce Metin içinde sekme ile dört boşlu...
Gerçekten nasıl okunur metin Java sını...