SORU
5 HAZİRAN 2012, Salı


Java sınıf isimleri büyük / küçük harf duyarlılığı

Eğer farklı bir dizin içinde büyük / küçük harf duyarlı aynı ada sahip iki halk Java sınıfları sonra bir yazar hem de sınıfların çalışma zamanında kullanılabilir. (Noktasal JVM birçok sürümü ile, Windows, Mac ve Linux üzerinde bunu test ettim. Kullanılabilir aynı anda nerede olduklarını orada diğer Jvm'ler olursa şaşırmam.) Eğer bir sınıf a ve bir adında adında oluşturmak için A.

// lowercase/src/testcase/a.java
package testcase;
public class a {
    public static String myCase() {
        return "lower";
    }
}

// uppercase/src/testcase/A.java 
package testcase;
public class A {
    public static String myCase() {
        return "upper";
    }
}

Üç tutulma projeleri yukarıdaki kod içeren available from my website.

Eğer denemek istiyorum, böylece her iki sınıf myCase arama:

System.out.println(A.myCase());
System.out.println(a.myCase());

Bu typechecker başarılı olur, ancak sınıf kodu oluştur dosya doğrudan yukarıda çalıştırdığımda alıyorum:

İş parçacığı özel durum "main" java.lang.NoClassDefFoundError: deneme durumu (yanlış adı: deneme durumu/a)

Java, isimleri genel durumda duyarlıdır. Bazı dosya sistemleri (örneğin Windows) yukarıdaki davranış olur şaşırmadım, ama öyle görünüyor ki büyük / küçük harf duyarlıyanlış. Ne yazık ki Java özellikleri garip görünür olmayan bir commital. Java Language Specification (JLS), Java SE 7 Edition (6.6.1, sayfa 166 Bölüm) diyor ki:

Eğer sınıf veya arabirim kamu bildirilirse, o zaman erişilmesi olabilir herhangi bir kod, bildirilmiş derleme birimi (madde 7.3) olması kaydıyla gözlemlenebilir.

Bölüm 7.3, İDEA son derece muğlak ifadelerle bir derleme biriminin görünürlük tanımlar:

Önceden tanımlanmış paket java ve alt paketleri kendi lang tüm derleme birimleri ve ıo her zaman gözlemlenebilir. Diğer tüm paketler içinana sistem derleme birimleri gözlemlenebilir belirler.

Java Virtual Machine Specification benzer şekilde belirsiz (Bölüm 5.3.1):

Aşağıdaki adımları yüklemek için kullanılır ve böylece nonarray sınıf veya oluştur belirtilen [ikili adı] tarafından arayüzü C N bootstrap sınıf yükleyicisi kullanarak [...] Aksi takdirde, Java sanal makine, bir çağırma için argüman N geçer bootstrap sınıf yükleyicisi yöntemi sözde gösterimi için arama yapmak için C platform bağımlı bir şekilde.

Tüm bu önemi azalan sırada: dört soru yol açar

  1. Her JVM varsayılan sınıf yükleyicisi(ler) tarafından yüklenebilir olduğu konusunda herhangi bir garanti var mı? Diğer bir deyişle, geçerli bir uygulama, ama JVM dejenere miyim, java dışında herhangi bir sınıf yük olmayacak.lang, java.ıo?
  2. Eğer herhangi bir garantisi varsa, yukarıdaki örnekte, bu davranış garanti (yani davranışı bir hata değildir) ihlal ediyor?
  3. Fi a A aynı anda yükleme yapmak için herhangi bir yolu var mı? İster özel sınıf yükleyicisi bir eser yazmaya?

CEVAP
5 HAZİRAN 2012, Salı


  • Her JVM içinde bootstrap sınıf yükleyicisi tarafından yüklenebilir olduğu konusunda herhangi bir garanti var mı?

Dilin çekirdek parçaları, artı destekleyen uygulama sınıfları. Garantili yazdığınız herhangi bir sınıfa dahil etmek. (Normal JVM yükler sınıfları ayrı classloader dan bootstrap, ve aslında normal önyükleme yükleyicisi yükler sınıflardan bir KAVANOZ normalde, bu yapan için daha verimli bir dağıtım daha kocaman bir dizin yapısı tam sınıfları.)

  • Eğer herhangi bir garantisi varsa, yukarıdaki örnekte, bu davranış garanti (yani davranışı bir hata değildir) ihlal ediyor?
  • Orada "Jvm'ler bir ve aynı anda? yük" standart yapmak için herhangi bir yolu var mı İster özel sınıf yükleyicisi bir eser yazmaya?

O sınıf için aranır bir dosya içine, sınıfın tam adını eşleyerek yükler sınıfları Java. Böylece testcase.a 10 ** gider testcase.A testcase/A.class gider. Bazı dosya sistemleri bu işler karışmış, diğeri için sorulduğunda kadar hizmet edebilir. Diğerleri değil (özellikle, ZİP formatı JAR dosyalarında kullanılan değişken büyük küçük harf duyarlı ve taşınabilir tam olarak). Hiç bir şekilde Java yapabilirim bu konuda (gerçi bir IDE başa çıkabilir bunun için uğraşıyorum .class dosyaları uzak yerel FS, bilmiyorum gerçi ve FIRSATLAR javac kesinlikle değil akıllı).

Burada dikkat edilmesi gereken tek konu bu değil ancak: sınıf dosyaları DAHİLİ olarak ne hakkında konuşuyorlar. Bu yokluğubeklendiğidosyadan sınıfı yük, aldı NoClassDefFoundError yol başarısız anlamına gelir. Neyin var ve sağlam tespit dağıtılan bir sorun (en azından bazı açılardan yanlış bir dağıtım). Teorik olarak, arama, ama tutarak böyle şeyler ele verebilir bir classloader inşa olabilirneden?Bir KAVANOZUN içine sınıf dosyaları koyarak şeyler çok daha sağlam tamir eder; bu doğru işlenir.

Eğer bu gerçek bir sorun haline çalıştırıyorsanız daha genel olarak, bir sürü, bir Unıx üzerinde üretim yapıyor yapılar için büyük küçük harf duyarlı dosya sistemi (Jenkins gibi CI sistemi önerilir)geliştiriciler sadece büyük farklar olan sınıflara adlandırma ve kabul edilmektedironlara çok kafa karıştırıcı gibi!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • Gali B

    Gali B

    1 EYLÜL 2006
  • Plugable

    Plugable

    19 Mayıs 2010