2013-04-09 38 views
13

Sự khác biệt giữa số Class.getName()Class.getCanonicalName() của Java là gì?Sự khác biệt giữa Tên và CanonicalName là gì?

+1

Xem thêm http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav – Anush

+0

@Anush vui nhộn, tôi đã không nhìn thấy cái đó khi nhìn nó, chỉ lớn hơn tôi một tháng. Cảm ơn – durron597

Trả lời

17

Hãy xem xét các chương trình sau đây:

package org.test.stackoverflow; 

public class CanonicalName { 

    public static void main(String[] args) { 
    CanonicalName cn = new CanonicalName(); 
    cn.printClassNames(); 
    } 

    private Anonymous anony; 
    private MyAnony myAnony; 

    public CanonicalName() { 
    anony = new Anonymous() { 
     public void printInterface() { 
     System.out.println("Anony Name: " + getClass().getName()); 
     System.out.println("Anony CanonicalName: " + getClass().getCanonicalName()); 
     } 
    }; 
    myAnony = new MyAnony(); 
    } 

    public void printClassNames() { 
    System.out.println("CanonicalName, Name: " + getClass().getName()); 
    System.out.println("CanonicalName, CanonicalName: " + getClass().getCanonicalName()); 
    anony.printInterface(); 
    myAnony.printInterface(); 
    } 

    private static interface Anonymous { 
    public void printInterface(); 
    } 

    private static class MyAnony implements Anonymous { 
    public void printInterface() { 
     System.out.println("MyAnony Name: " + getClass().getName()); 
     System.out.println("MyAnony CanonicalName: " + getClass().getCanonicalName()); 
    } 
    } 
} 

Output:

CanonicalName, Name: org.test.stackoverflow.CanonicalName 
CanonicalName, CanonicalName: org.test.stackoverflow.CanonicalName 
Anony Name: org.test.stackoverflow.CanonicalName$1 
Anony CanonicalName: null 
MyAnony Name: org.test.stackoverflow.CanonicalName$MyAnony 
MyAnony CanonicalName: org.test.stackoverflow.CanonicalName.MyAnony 

Vì vậy, có vẻ như cho các lớp học cơ sở, họ trở về cùng một điều. Đối với các lớp bên trong, getName() sử dụng quy ước đặt tên $ (tức là những gì được sử dụng cho các tệp .class) và getCanonicalName() trả về những gì bạn sẽ sử dụng nếu bạn đang cố gắng tạo lớp. Bạn không thể làm điều đó với một lớp ẩn danh (ít-a), vì vậy đó là lý do tại sao getCanonicalName() trả về giá trị rỗng.

+1

Không thể tìm thấy câu trả lời cho câu hỏi của riêng bạn chỉ trong vài giây. Trông giống như lừa dối. Thời gian của câu hỏi và câu trả lời là chính xác như nhau. –

+9

@MaciejZiarko Có một hộp kiểm ở phía dưới "trả lời câu hỏi của riêng bạn, phong cách Q & A. Tôi muốn thêm khám phá gần đây của tôi vào cơ sở kiến ​​thức trong SO, bởi vì tôi không thể tìm thấy nó ở bất cứ đâu. – durron597

+0

các lớp học sau khi các khái niệm rất bạn đang cố gắng để khám phá/miêu tả ... – Andrew

Các vấn đề liên quan