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.