SORU
19 Ocak 2010, Salı


Arasındaki fark nedir "Sınıf.() forName" ve "Sınıf.() forName.() newİnstance"?

Class.forName() Class.forName().newInstance() arasındaki fark nedir?

Önemli fark (onlar hakkında bir şey okudum!) anlamıyorum. Bana yardım eder misiniz? Teşekkürler.

CEVAP
19 Ocak 2010, Salı


Belki bir örnek her iki yöntem de nasıl kullanıldığını gösteren şeyleri daha iyi anlamanıza yardımcı olacaktır. Yani, düşünün, aşağıdaki sınıf:

package test;

public class Demo {

    public Demo() {
        System.out.println("Hi!");
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("test.Demo");
        Demo demo = (Demo) clazz.newInstance();
    }
}

Kendi javadoc Class.forName(String) arayıp bilgilendirdiClass nesnenin belirli bir dize adı ile sınıf veya arabirim ile ilişkili veriryani yazın clazz değişken etkilenen test.Demo.class döner Class.

Sonra, clazz.newInstance() aramaoluşturur sınıfının yeni bir örneği tarafından temsil edilen Class nesne. Sınıfı boş bir bağımsız değişken listesi ile new bir ifade gibi örneği.Diğer bir deyişle, bu aslında new Demo() bir eşdeğerdir ve Demo yeni bir örneğini döndürür.

Ve Demo bu sınıf çalışan böylece aşağıdaki çıktıyı yazdırır:

Hi!

new geleneksel büyük farkı newInstance çalışma zamanı kadar, kodunuzu daha dinamik hale bilmediğin bir sınıf oluşturmak için izin vermektedir.

Tipik bir örnek, çalışma zamanında, tam sürücü çalışmayı gerçekleştirmek için gerekli olan BULUNMAKTAYDI API. Konteyner EJBs, Sunucu uygulaması kaplar başka güzel örnek: dinamik yük yükleme zamanı ve çalışma zamanı, daha önce hiçbir şey bilmiyorlar bileşenleri oluşturmak için kullanıyorlar.

Eğer daha ileri gitmek istiyorsanız aslında, paragrafın hemen üstünde alıntı olduğunu Understanding Class.forName() Ted Neward kağıt bakabilirsiniz.

EDİT(OP yorum olarak gönderilen bir soruya cevap): yerli mal sürücüleri biraz daha özel. Getting Started with the JDBC API DriverManager bölümde açıkladı:

( ... ) Driver bir sınıf yüklü, ve bu nedenle otomatik olarak kayıtlı iki kişiden biri DriverManager ile yol:

  1. yöntemi Class.forName çağırarak. Bu açıkça yükler sürücü sınıfı. Etmediğinden herhangi bir dış kurulum bu şekilde bağlı yükleme sürücüsü önerilir DriverManagerkullanarak bir çerçeve. Aşağıdaki kod yükler sınıf 25**:

    Class.forName("acme.db.Driver");
    

    Eğer acme.db.Driver yükleme öylesine yazılmış bir neden oluşturulacak örnek ve ayrıca aramalar DriverManager.registerDriver ile parametre olarak örneği(bunun gibi yapmak gerekir), o zaman. DriverManager'nın sürücülerinin listesi ve bir bağlantı oluşturmak için kullanılabilir.

  2. (...)

Her iki durumda da, DriverManager.registerDriver çağırarak kendini kayıt defterine yeni yüklenen Driver sınıfının sorumluluğundadır. Belirtildiği gibi, bu sınıfı yüklendiğinde otomatik olarak yapılmalıdır.

Başlatma sırasında kendilerini kayıt için gerekli OLANLARI sürücüsü genellikle bu gibi statik başlatma bloğu kullanın:

package acme.db;

public class Driver {

    static {
        java.sql.DriverManager.registerDriver(new Driver());
    }

    ...
}

Class.forName("acme.db.Driver") arama acme.db.Driver sınıfı başlatılması ve statik başlatma bloğu yürütme böylece neden olur. Ve Class.forName("acme.db.Driver") aslında "" bir örnek, ama bu (iyi) OLANLARI (Sürücü nasıl uygulandığını sadece bir sonucudur. oluşturur

Bir yan not olarak, bu artık gerekli değil gerekli OLANLARI 4.0(Java 7'den beri varsayılan paket olarak eklendi) ve yeni otomatik yüklemeli OLANLARI 4.0 sürücüleri özellik ile belirtmek isterim. JDBC 4.0 enhancements in Java SE 6 bkz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008