Java'da .class ne anlama geliyor?


152

.classJava'da ne anlama geliyor? Örneğin, adlı bir sınıf oluşturduysam Print. Ne Print.classdönüyor?



Korkarım ne istediğinizi tam olarak anlamıyorum. Biraz daha detaylandırırsanız, birisi size daha yararlı bilgiler sağlayabilir
Paul Walker

29
Bu bana kesinlikle gerçek bir soru gibi görünüyor. Bu soruyu kendime soruyordum ve hızlı bir Google aramasından sonra kendimi burada buldum. Sanırım sorumun gerçek olmadığını bilseydim rahatsız olmamalıydım!
Doctor Jones

1
Ayrıca, belirli arama dizisinin garipliği nedeniyle, bu soru hakkında çok az yazılı veya bulunabilir olduğunu düşünüyorum. Yukarıda bağlantılı API dokümanları dışında, başka hiçbir yerde bahsedilen bu gösterimi hiç görmedim (ancak yansımada sıklıkla kullanıldığını görseniz de).
jordanpg

2
@MadProgrammer OP, .classsadece tesadüfen .classdosya adı uzantısı ile ilgili olan sözdizimini soruyor .
jordanpg

Yanıtlar:


144

Bir .classsınıf adından sonra yazdığınızda , sınıf değişmezine - verilen sınıfla ilgilijava.lang.Class bilgileri temsil eden nesneye başvurur .

Örneğin, sınıfınız ise Print, çalışma zamanında Print.classsınıfı temsil eden bir nesnedir Print. getClass()Herhangi bir (doğrudan) örneğinin yöntemi tarafından döndürülen nesnenin aynısıdır Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

2
Bir sınıf nesnesiyle yapılabilecek bazı şeyler nelerdir?
Kevin

7
@Kevin java.lang.Class için API belgelerine bakın .
Patricia Shanahan

Uygulama: örneğin, özel alanları erişirken: Writer.class.getDeclaredField("writeBuffer").
jordanpg

2
Öyleyse türü Print.classnedir?
Zhipeng YANG

1
Ve Android nasıl işliyor new Intent(this, Activity.class? class ActivityHer sınıfı karşılaştırarak bulmaya çalışacak mı?
Zhipeng YANG

56

.class sınıfın bir örneği olmadığında kullanılır.

.getClass() sınıfın bir örneği mevcut olduğunda kullanılır.

object.getClass() verilen nesnenin sınıfını döndürür.

Örneğin:

String string = "hello";
System.out.println(string.getClass().toString());

Bu çıktı:

class java.lang.String

Bu, dize nesnesinin sınıfıdır :)


7
getClass()yalnızca sınıfın bir nesnesine işaret eden bir referansınız varsa kullanışlıdır. ClassName.classsınıfın örneği olmasa bile kullanılabilir. Örneğin, düşünün Math.class. Her biri belirli durumlar için doğrudur.
Patricia Shanahan

Harika bir açıklama. Haklısın arasında ayrım tespit nasıl it.Love noktasına .classve.getClass().
Sevastyan Savanyuk

6

Bir nesnenin bir örneği mevcutsa, sınıfını almanın en basit yolu çağırmaktır. Object.getClass()

.classSözdizimi

Tür mevcutsa ancak örnek yoksa, türün .classadına ekleyerek bir Sınıf elde etmek mümkündür . Bu aynı zamanda, ilkel bir tür için Sınıfı edinmenin en kolay yoludur.

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

Bkz: docs.oracle.com sınıf hakkında


6

Sadece açıklığa kavuşturmak için, bu '.class' yöntemi java kodunu derledikten sonra gördüğünüz bayt kodu dosyasına veya OOP teorisindeki Sınıf ve Nesne kavramları arasında bir karışıklığa atıfta bulunmuyor.

Bu '.class' yöntemi Java'da kod Yansıması için kullanılır. Genel olarak, sınıfınız için tam nitelikli sınıf adı, sabitler listesi, genel alanların listesi vb. Gibi meta verileri toplayabilirsiniz.

Tüm ayrıntıları almak için bu bağlantıları (yukarıda belirtilen) kontrol
edin : https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html

Normalde, projenizi oluşturmaya başladığınızda hemen Reflection'ı kullanmayı planlamazsınız. Zaten çalışan kodu yönetmeye çalıştıktan sonra ihtiyacınız olduğunu bildiğiniz bir şey. Çoğu zaman programınızın birden çok örneğini yönetmek için buna ihtiyacınız vardır. Belki bir şeyin önceden tanımlanıp tanımlanmadığını belirlemek için her bir 'klonu' tanımlamak veya işlevlerin sayısını saymak veya sadece sınıfınızın belirli bir örneğinin ayrıntılarını günlüğe kaydetmek istersiniz.


3

Kullanılabilir bir örnek yoksa, .classsözdizimi bir sınıfa karşılık gelen Class nesnesini almak için kullanılır, aksi takdirde Class nesnesini almak için getClass () yöntemini kullanabilirsiniz. İlkel veri türü örneği olmadığından, .classilkel veri türleri için sözdizimi kullanmalıyız .

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }

1

Bence buradaki anahtar, Sınıf ve Nesne arasındaki farkı anlamaktır. Bir Nesne, bir Sınıfın bir örneğidir. Ancak tamamen nesne yönelimli bir dilde, Sınıf aynı zamanda bir Nesnedir . Böylece çağırma .class, bu Sınıfın Class nesnesine başvuruyu alır ve bu daha sonra değiştirilebilir.


4
in a fully object-oriented language, a Class is also an Object? <alıntı gerekli>
Sam Dufel

0

Bir sınıf değişmezi, bir sınıfın, arabirimin, dizinin veya ilkel türün adından veya sözde türdeki boşluktan ve ardından bir '' ifadesinden oluşan bir ifadedir. ve belirteç sınıfı. JDK 5.0'daki değişikliklerden biri, java.lang.Class sınıfının genel olmasıdır java.lang.Class Class<T>, bu nedenle:

Class<Print> p = Print.class;

Referanslar burada:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

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.