Java'da paket adı dahil mevcut sınıf adı nasıl alınır?


82

Bir proje üzerinde çalışıyorum ve bir gereksinim, ana yöntemin 2. argümanı " /" (linux için) ile başlıyorsa, onu mutlak bir yol (sorun değil) olarak kabul etmelidir, ancak eğer " /", Sınıfın mevcut çalışma yolunu almalı ve verilen argümanı ona eklemelidir .

: Ben birkaç şekilde sınıf adını alabilir System.getProperty("java.class.path"), new File(".")ve getCanonicalPath()benzeri, ve ...

Sorun şu ki, bu bana yalnızca paketlerin depolandığı dizini veriyor - yani " .../project/this/is/package/name" içinde depolanan bir sınıfım varsa , bu bana yalnızca " /project/" verir ve gerçek .class filesyaşadığı paket adını yok sayar .

Herhangi bir öneri?

DÜZENLEME: İşte alıştırma açıklamasından alınan açıklama

sourcedir mutlak ("/" ile başlayarak) veya programı nereden çalıştırdığımıza bağlı olabilir

sourcedir, ana yöntem için verilen bir argümandır. bu yolu nasıl bulabilirim?


2
Kod bir JAR içinde paketlenmişse (ya da varsaydığınız gibi bir klasör / dosya yapısında değilse) ne yapacaksınız? Bu tehlikeli bir varsayım; bu küçük bir deney, sınıf ödevi veya diğer tek kullanımlık durumlar için iyi çalışabilir, ancak LÜTFEN üretim kalitesi kodu için bu varsayımı yapma alışkanlığını edinmeyin.
E-Riz

Sınıf dosyasına giden yolu bulmanın bir anlamı yoktur. Ayrıca alıştırma açıklamasında, dikkatlice okursanız ( programı çalıştırdığımız yer, programın kullanıcı tarafından çağrıldığı geçerli yol anlamına gelir) belirtmez .
The Nail

Belki gereksinimi daha iyi anlamama yardım edebilirsin? Argümanın '/' ile başladığını kontrol etmem gerekiyor (açıklamada bahsediliyor). eğer öyleyse, onu mutlak olarak kullanın. olduğu gibi. ama değilse, nasıl tedavi etmeliyim?
La bla bla

Yanıtlar:


166

this.getClass().getCanonicalName()Tam sınıf adını almak için kullanın .

Bir paket / sınıf adının ("abC") .class dosyalarının yolundan (a / b / C.class) farklı olduğunu ve bir yolu türetmek için paket adı / sınıf adını kullanmanın genellikle kötü bir uygulama olduğunu unutmayın. Sınıf dosyalarının / paketlerinin kümeleri, dizinler veya jar dosyaları olabilen birden çok farklı sınıf yolunda olabilir.


teşekkürler, ancak bu ana yöntemde ve 'bu' statik yöntemlerde kullanılamaz. etrafında herhangi bir çalışma var mı?
La bla bla


30

Bunu Classyapabilen bir sınıf var :

Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass();          // if you want to use the current class

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());

Eğer csınıf temsil MyClasspakette mypackage, yukarıdaki kod basacaktır:

Paket: mypackage
Sınıf: MyClass
Tam Tanımlayıcı: mypackage.MyClass

Bu bilgileri alabilir ve ihtiyacınız olan şey için değiştirebilir veya daha fazla bilgi için API'yi kontrol edebilirsiniz .


1
Class.forName ("MyClass") yalnızca varsayılan paketteyse (yani paket bildirimi yoksa) çalışacağını unutmayın.
The Nail

2
@TheNail true ve getName()şimdi düzenleyerek sınıf adıyla birlikte paket adını döndürür.
Jon Egeland

getSimpleName()Paket adı olmadan yalnızca sınıf adını almak için kullanın .
The Nail

1
Bunun yerine, başka bir nedenle çalışma zamanı keşfine gerçekten ihtiyacınız olmadıkça Class.forName("MyClass")kullanmalısınız MyClass.class.
mjaggard

12

Tam nitelikli ad aşağıdaki şekilde elde edilir:

String fqn = YourClass.class.getName();

Ancak bir sınıf yolu kaynağını okumanız gerekir. Öyleyse kullan

InputStream in = YourClass.getResourceAsStream("resource.txt");

3

kullanmak this.getClass().getName()için packageName.classNameve kullanım this.getClass().getSimpleName()yalnızca sınıf adını almak için

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.