Varsayılan pakette java sınıflarına nasıl erişilir?


98

Şimdi bir Grails projesinde başkalarıyla birlikte çalışıyorum. Bazı Java dersleri yazmam gerekiyor. Ama harika ile oluşturulmuş aranabilir bir nesneye erişmem gerekiyor. Görünüşe göre, bu nesnenin varsayılan pakete yerleştirilmesi gerekiyor.

Sorum şu: Varsayılan paketteki bu nesneye adlandırılmış bir paketteki bir Java sınıfından erişmenin bir yolu var mı?

Yanıtlar:


129

Varsayılan paketteki sınıfları adlandırılmış bir paketten kullanamazsınız .
( Sharique Abdullah'ın yansıma API'si aracılığıyla verdiği yanıtta gösterildiği gibi, teknik olarak yapabilirsiniz, ancak adsız ad alanındaki sınıflar bir ithalat bildiriminde kapsam dahilinde değildir )

J2SE 1.4'ten önce, aşağıdaki gibi bir sözdizimi kullanarak sınıfları varsayılan paketten içe aktarabiliyordunuz:

import Unfinished;

Buna artık izin verilmiyor . Bu nedenle, paketlenmiş bir sınıfın içinden varsayılan bir paket sınıfına erişmek, varsayılan paket sınıfını kendi paketine taşımayı gerektirir.

Groovy tarafından oluşturulan kaynağa erişiminiz varsa, dosyayı özel bir pakete taşımak ve bu "paket" direktifini başlangıcına eklemek için biraz sonradan işlem yapılması gerekir.


2014 Güncellemesi: JDK7 ve JDK8 için hata 6975015 , adsız paketten içe aktarmaya karşı daha da katı bir yasağı açıklıyor .

TypeNameBir sınıf türü, arayüz tipi, enum türü veya ek açıklama türü standart adı olmalıdır.
Türü bir üyesi ya olmalıdır adlandırılan paket , ya da en dıştaki lexically türü kuşatan bir üyesi olan bir tipteki bir üyesi adlı paket , ya da bir hata meydana gelen bir derleme .


Andreas çıkış noktalarını yorumlarda :

"Neden [varsayılan paket] ilk etapta orada? tasarım hatası?"

Hayır, kasıtlı.
JLS 7.4.2. Adsız Paketler diyor ki: "Adsız paketler Java SE platformu tarafından temel olarak küçük veya geçici uygulamalar geliştirirken veya geliştirmeye yeni başlarken kolaylık sağlamak için sağlanır".


7
Daha önce başkalarına da açıkladığım gibi, varsayılan paket Java dünyasında ikinci sınıf bir vatandaştır. Sadece Bunu Yapma. :-)
Chris Jester-Young

1
Görünüşe göre Groovy'yi (çok zaman kısıtlı bir projede) veya varsayılan pakette kod öğrenmem gerekiyor. :-(
Mnementh

11
@ ChrisJester-Young öyleyse neden ilk etapta orada? tasarım hatası?
Pacerier

Neden kullanımdan kaldırıldı?
Suzan Cioc

@SuzanCioc: "Neden J2SE1.4'ten sonra varsayılan pakete artık erişemiyorsunuz?"
VonC

61

Aslında yapabilirsiniz.

Yansıma API'sini kullanarak şimdiye kadar herhangi bir sınıfa erişebilirsiniz. En azından başardım :)

Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");

Scala için aşağıdaki kod çalışır:val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Jus12

2
Harika yanıt, +1. Bununla birlikte, soru harika olduğu için, ördek yazmayı kullanabilirsiniz (sanırım Kanal bantlama gibi) ...Class.forName("FooBar").newInstance().fooMethod("I did it")
Bill K

7

Jar dosyasını aşağıdaki kuralla yeniden paketlemek için jarjar'ı kullanın :

rule * <target package name>.@1

Kaynak jar dosyasının varsayılan paketindeki tüm sınıflar hedef pakete taşınır, böylece erişebilirler.


4
jarjar'ın nasıl kullanılacağına dair bir demo harika olurdu
BiGGZ 21

@BiGGZ: jarjar'ı ant, gradle veya komut satırı ile nasıl kullanacağınızı görmek için jarjar github deposundaki README.md dosyasına bakın .
Lucidiot

3

Kodda paketleri kullanabilirsiniz Groovyve her şey yolunda gidecektir.

İlk grails-appbaşta kodun küçük bir yeniden düzenlenmesi ve biraz acı anlamına gelebilir , ancak büyük bir grails projesinde, paketleri paketler halinde düzenlemek mantıklıdır. Java standart paket adlandırma kuralını kullanıyoruz com.foo.<app>.<package>.

Her şeyin varsayılan pakette olması, bulduğunuz gibi entegrasyonun önünde bir engel haline gelir.

Denetleyiciler, bir Java paketine konulmaya direnen tek Grails artefaktı (veya artefakt) gibi görünüyor. Muhtemelen bunun ne Conventionolduğunu henüz anlamadım. ;-)


0

sadece fikri tamamlamak için:

Varsayılan paketin içinden adlandırılmış paketlerde bulunan nesnelere erişebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.