Sự khác nhau giữa a.getClass() và A.class trong Java

Trong Java, class java.lang.Class là một entry point của mọi thao tác của reflection API. Trong Java chúng ta có 2 cách để lấy java.lang.Class object:

  • Sử dụng Object.getClass() method
  • Sử dụng .class

Cách java.lang.Class object trong Java

Method Object.getClass() là một instance method của Object class. Nếu chúng ta có một object, chúng ta có thể gọi object.getClass() để lấy Class object của nó.

Tương tự chúng ta có thể sử dụng ClassName.class để để Class object với kiểu dữ liệu tương ứng.

public class Main {

    public static void main(String[] args) throws Exception {
        String str = "I am an object of the String class";

        Class fromStrObject = str.getClass();
        Class clazz = String.class;
        System.out.println(fromStrObject);
        System.out.println(clazz);
    }
}

Output

class java.lang.String
class java.lang.String

Runtime Type và Static type

Qua ví dụ trên có thể chúng ta sẽ suy nghĩ rằng 2 cách này hoàn toàn giống nhau, tuy nhiên chúng có một điểm khác biệt lớn đó là:

  • object.getClass() sẽ trả về runtime Class object type
  • ClassName.class trả về Class object static

Để dễ hiểu hơn chúng ta cùng xem qua ví dụ sau

public class Animal {
    protected int numberOfEyes;
}

public class Monkey extends Animal {
    // monkey stuff
}

Bây giờ chúng ta sẽ khởi tạo một Animal object như sau

public class Main {

    public static void main(String[] args) {
        Animal animal = new Monkey();

        Class runtimeType = animal.getClass();
        Class staticType = Animal.class;

        System.out.println(runtimeType);
        System.out.println(staticType);
    }
}

Output

class com.deft.Monkey
class com.deft.Animal

Chúng ta có thể thấy runtimeType object đã trả về kiểu dữ liệu tại thời điểm runtime là Monkey thay vì Animal như kiểu Animal.class.

Tóm lược

Qua bài viết này chúng ta đã biết cách phân biệt giữa A.class và object.getClass() khác nhau như thế nào. 

Nguồn: Baeldung

5 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x