SORU
31 EKİM 2008, Cuma


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
31 EKİM 2008, Cuma


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);

more complete solution:

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");

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CHISTOSITOJAJA

    CHISTOSITOJA

    27 HAZİRAN 2010
  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008