Làm thế nào để lấy tên lớp hiện tại bao gồm tên gói trong Java?


82

Tôi đang làm việc trên một dự án và một yêu cầu là nếu đối số thứ 2 cho phương thức chính bắt đầu bằng “ /” (đối với linux) thì nó phải coi nó như một đường dẫn tuyệt đối (không phải là một vấn đề), nhưng nếu nó không bắt đầu bằng “ /”, Nó sẽ nhận được đường dẫn làm việc hiện tại của lớp và thêm vào đó đối số đã cho.

Tôi có thể lấy tên lớp bằng nhiều cách: System.getProperty("java.class.path"), new File(".")getCanonicalPath(), và vân vân ...

Vấn đề là, điều này chỉ cung cấp cho tôi thư mục mà các gói được lưu trữ - tức là nếu tôi có một lớp được lưu trữ trong " .../project/this/is/package/name", nó sẽ chỉ cung cấp cho tôi " /project/" và bỏ qua tên gói nơi thực sự .class filestồn tại.

Bất kỳ đề xuất?

CHỈNH SỬA: Đây là lời giải thích, lấy từ mô tả bài tập

nguồn gốc có thể là tuyệt đối (bắt đầu bằng “/”) hoặc liên quan đến nơi chúng tôi chạy chương trình từ đó

chuacedir là một đối số nhất định cho phương thức chính. làm thế nào tôi có thể tìm thấy con đường đó?


2
Bạn sẽ làm gì nếu mã được đóng gói trong JAR (hoặc không nằm trong cấu trúc thư mục / tệp như bạn đang giả định)? Đó là một giả định nguy hiểm; điều này có thể hoạt động tốt đối với một thử nghiệm nhỏ, bài tập trên lớp hoặc tình huống dùng một lần khác, nhưng VUI LÒNG đừng có thói quen đưa ra giả định đó cho mã chất lượng sản xuất.
E-Riz

Không có ý nghĩa gì khi tìm đường dẫn đến tệp lớp. Ngoài ra, mô tả bài tập không đề cập đến điều đó nếu bạn đọc kỹ ( nơi chúng tôi chạy chương trình từ có nghĩa là đường dẫn hiện tại mà từ đó chương trình được gọi bởi người dùng).
The Nail

Có lẽ bạn có thể giúp tôi hiểu rõ hơn về yêu cầu? Tôi cần kiểm tra đối số bắt đầu bằng dấu '/' (đề cập trong phần mô tả). nếu có, chỉ cần sử dụng nó là tuyệt đối. như vậy. nhưng nếu không khỏi thì tôi phải điều trị như thế nào?
La bla bla

Câu trả lời:


166

Sử dụng this.getClass().getCanonicalName()để lấy tên lớp đầy đủ.

Lưu ý rằng tên gói / lớp ("abC") khác với đường dẫn của tệp .class (a / b / C.class) và việc sử dụng tên gói / tên lớp để dẫn xuất đường dẫn thường là một phương pháp không tốt. Tập hợp các tệp / gói lớp có thể ở nhiều đường dẫn lớp khác nhau, có thể là thư mục hoặc tệp jar.


cảm ơn, nhưng nó nằm trong phương thức chính và không thể sử dụng 'this' trong phương thức tĩnh. bất kỳ công việc xung quanh nó?
La bla bla


30

Có một lớp, Classcó thể làm điều này:

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());

Nếu cđại diện cho lớp MyClasstrong gói mypackage, mã trên sẽ in:

Gói: mypackage
Lớp: MyClass
Định danh đầy đủ: mypackage.MyClass

Bạn có thể lấy thông tin này và sửa đổi nó cho bất kỳ điều gì bạn cần hoặc truy cập API để biết thêm thông tin.


1
Lưu ý rằng Class.forName ("MyClass") sẽ chỉ hoạt động nếu nó nằm trong gói mặc định (tức là không có khai báo gói).
The Nail

2
@TheNail true và getName()trả về tên gói cùng với tên lớp, đang chỉnh sửa.
Jon Egeland

Sử dụng getSimpleName()để chỉ lấy tên lớp mà không có tên gói.
The Nail

1
Thay vì Class.forName("MyClass")bạn nên sử dụng MyClass.classtrừ khi bạn thực sự cần khám phá thời gian chạy vì một số lý do khác.
mjaggard

12

Tên đủ điều kiện được chọn như sau:

String fqn = YourClass.class.getName();

Nhưng bạn cần đọc một tài nguyên classpath. Vì vậy, hãy sử dụng

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

3

sử dụng this.getClass().getName()để lấy packageName.classNamevà sử dụng this.getClass().getSimpleName()để chỉ lấy tên lớp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.