อะไร.class
หมายถึงใน Java? Print
ตัวอย่างเช่นถ้าฉันสร้างระดับที่เรียกว่า อะไรPrint.class
กลับมา?
.class
ไวยากรณ์ที่เกี่ยวข้องเฉพาะกับ.class
ส่วนขยายชื่อไฟล์โดยบังเอิญ
อะไร.class
หมายถึงใน Java? Print
ตัวอย่างเช่นถ้าฉันสร้างระดับที่เรียกว่า อะไรPrint.class
กลับมา?
.class
ไวยากรณ์ที่เกี่ยวข้องเฉพาะกับ.class
ส่วนขยายชื่อไฟล์โดยบังเอิญ
คำตอบ:
เมื่อคุณเขียน.class
หลังจากชื่อคลาสมันจะอ้างอิงคลาสตัวอักษร -
java.lang.Class
วัตถุที่แสดงข้อมูลเกี่ยวกับคลาสที่กำหนด
ตัวอย่างเช่นถ้าระดับของคุณอยู่Print
แล้วPrint.class
เป็นวัตถุที่แสดงถึงระดับชั้นPrint
บนรันไทม์ มันเป็นวัตถุเดียวกันที่ถูกส่งกลับโดยgetClass()
วิธีการใด ๆ (โดยตรง) Print
ตัวอย่างของ
Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
อะไร
new Intent(this, Activity.class
อย่างไร มันจะพยายามหาclass Activity
โดยเปรียบเทียบแต่ละชั้น?
.class
จะใช้เมื่อไม่มีอินสแตนซ์ของคลาสที่พร้อมใช้งาน
.getClass()
ใช้เมื่อมีอินสแตนซ์ของคลาสที่พร้อมใช้งาน
object.getClass()
ส่งคืนชั้นของวัตถุที่กำหนด
ตัวอย่างเช่น:
String string = "hello";
System.out.println(string.getClass().toString());
สิ่งนี้จะออก:
class java.lang.String
นี่คือคลาสของวัตถุสตริง :)
getClass()
มีประโยชน์ก็ต่อเมื่อคุณมีการอ้างอิงที่ชี้ไปยังวัตถุของคลาส ClassName.class
สามารถใช้ได้แม้ว่าคลาสจะไม่มีกรณี Math.class
ตัวอย่างเช่นพิจารณา แต่ละอย่างถูกต้องสำหรับบางสถานการณ์
.class
และ.getClass().
หากมีวัตถุของอินสแตนซ์อยู่วิธีที่ง่ายที่สุดในการเรียกคลาสนั้นคือการเรียกใช้ Object.getClass()
.class
ไวยากรณ์
หากชนิดนั้นพร้อมใช้งาน แต่ไม่มีอินสแตนซ์ดังนั้นจึงเป็นไปได้ที่จะได้รับคลาสโดยการต่อท้าย.class
ชื่อของประเภท นี่เป็นวิธีที่ง่ายที่สุดในการรับ Class สำหรับประเภทดั้งเดิม
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
เพื่อชี้แจงวิธี '.class' นี้ไม่ได้อ้างถึงไฟล์ bytecode ที่คุณเห็นหลังจากรวบรวมรหัส java หรือความสับสนระหว่างแนวคิดของ Class vs. Object ในทฤษฎี OOP
เมธอด '.class' นี้ใช้ใน Java สำหรับโค้ด Reflection โดยทั่วไปคุณสามารถรวบรวมข้อมูล meta สำหรับคลาสของคุณเช่นชื่อคลาสแบบเต็ม, รายการค่าคงที่, รายชื่อเขตข้อมูลสาธารณะ ฯลฯ
ตรวจสอบลิงก์เหล่านี้ (ดังกล่าวข้างต้น) เพื่อรับรายละเอียดทั้งหมด:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
โดยปกติคุณไม่ได้วางแผนที่จะใช้ Reflection ทันทีเมื่อคุณเริ่มสร้างโครงการ เป็นสิ่งที่คุณรู้ว่าคุณต้องการหลังจากพยายามจัดการรหัสที่ใช้งานได้แล้ว หลายครั้งที่คุณต้องการให้มันจัดการโปรแกรมของคุณหลายอินสแตนซ์ บางทีคุณอาจต้องการระบุ 'โคลน' แต่ละอันเพื่อพิจารณาว่ามีบางสิ่งที่กำหนดไว้แล้วหรือนับจำนวนฟังก์ชั่นหรือเพียงแค่บันทึกรายละเอียดของอินสแตนซ์เฉพาะของชั้นเรียนของคุณ
ถ้าไม่มีอินสแตนซ์ให้ใช้.class
ไวยากรณ์จะได้รับวัตถุคลาสที่สอดคล้องกันสำหรับคลาสมิฉะนั้นคุณสามารถใช้วิธี getClass () เพื่อรับวัตถุคลาส เนื่องจากไม่มีอินสแตนซ์ของชนิดข้อมูลดั้งเดิมเราจึงต้องใช้.class
ไวยากรณ์สำหรับชนิดข้อมูลดั้งเดิม
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());
}
}
ฉันคิดว่ากุญแจสำคัญในที่นี้คือการเข้าใจความแตกต่างระหว่างคลาสและวัตถุ วัตถุเป็นตัวอย่างของการเรียน. แต่ในภาษาเชิงวัตถุทั้งหมดClass ก็เป็น Objectด้วยเช่นกัน ดังนั้นการโทร.class
จะได้รับการอ้างอิงไปยังวัตถุ Class ของ Class นั้นซึ่งสามารถจัดการได้
in a fully object-oriented language, a Class is also an Object
? <อ้างถึง>
คลาสตัวอักษรคือนิพจน์ที่ประกอบด้วยชื่อของคลาสอินเทอร์เฟซอาร์เรย์หรือชนิดดั้งเดิมหรือเป็นโมฆะหลอกชนิดตามด้วย '.' และชั้นโทเค็น หนึ่งในการเปลี่ยนแปลงใน JDK 5.0 คือคลาส java.lang.Class เป็นแบบทั่วไปjava.lang.Class Class<T>
ดังนั้น:
Class<Print> p = Print.class;
การอ้างอิงที่นี่:
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