做者在以前工做中,面試過不少求職者,發現有不少面試者對Java的 Class
搞不明白,理解的不到位,只知其一;不知其二,一到用的時候,就不太會用。java
由於本身自己之前剛學安卓的時候,甚至作安卓2,3年後,也是對 java的 Class
不是太清楚,因此想寫一篇關於Java Class
的文章,沒有那麼多專業名詞,但願用通俗的語言能把Java的 Class
這個概念講明白,理解了Class
後,Java的反射也就好理解多了。面試
Class
很容易,保證看了就明白,咱們先來熟悉一個最基礎的概念,什麼是類?編程
這個想必全部的學過面向對象編程語言的同窗應該都知道,下面給出正式一點的描述
類就是具有某些共同特徵的實體的集合數組
好比下面定義一個 Student 類編程語言
class Student{ String name; int age; public void learn(){ System.out.println("正在學習"); } public int getAge(){ return age; } public void hello(String message){ System.out.println(message); } }
全部的學生都有一姓名,都有年齡,都要去學習,這些都學生的共性函數
那麼既然全部的學生都有一些公共的特性,那麼咱們Java(其它語言也同樣)語言中,全部的類是否是也都有公共的特性呢?學習
是否是不太明白?全部的類都有公共的特性? 是的?沒聽錯
咱們再定義一個類Book
,以下測試
class Book{ private float price; private String author; }
全部的書都有 價格,做者等公共的特性(這裏爲了簡單,例子儘量代碼少點)code
因此,不論是上面的Student
,Book
類,仍是Java語言中的自帶類好比String
類對象
全部的類,都有下面的一些共性:
Student
, Book
, String
類,再加上包名,假如包名是 com.test , 那麼這些類的名字就是com.test.Student
, com.test.Book
, com.test.String
name
,age
,price
,author
learn()
public
,private
,protected
等經過上面的分析咱們知道,全部的類都有一些公共特性,那麼咱們就定義一個類,來描述這些公共特性,咱們暫且把這個類起個類名,叫 Info
其實咱們這裏的Info類,就是java中的Class,java中的Class
其實就是個普通的類而已,和其它的類沒什麼不同的。不信看看Class
定義
是否是就是一個普通的類,咱們把繼承關係去掉,是否是就是下面這樣了
public class Class { .... }
可不就是個普通的類嘛,只不過類名也叫Class
,和java中的關鍵字class
,只是首字母大寫了而已,要我說當初就不該該起名叫Class
,應該叫Type
,就不會有那麼多人誤解了,就不會有人把Class
,class
這兩個弄的暈頭轉向的傻傻分不清了。
總之一句話:Class就是一個普通的類,這個類描述的是全部的類的公共特性
瞭解Class類能幹什麼以前,咱們先來擴展一些其它的東西
既然上面咱們知道了,全部的類都是有公共特性的,咱們定義了一個叫Class
的類來描述這些公共特性
那麼是否是全部的類的方法,全部的類的字段,是否是也有公共的特性?
答案是的
是否是有點迷糊? 不要怕,很簡單,舉個例子就知道了。
仍是上面的Student
,Book
類,
Book
類中的price
字段,它的名字是否是"price"
Book
類中的price
字段,它的類型是 float
Book
類中的price
字段,它的修飾符是 private
因此這些類的字段公共的特性,咱們也能夠定義一個類來描述,這個類就是Field
咱們看一下JDK中關於Field的定義
是否是和Class
類同樣,Field
類也是一個普通的類
同理,類中全部的方法,是否是也有公共的特性?
答案:是的
Student
類中的getAge()
方法,它的方法名是 "getAge"
Student
類中的getAge()
方法,它的返回值是 int
類型Student
類中的hello(String message)
方法,有一個參數,參數的類型是值是 String
類型Student
類中的getAge()
方法,它修飾符號是 public
因此這些類的方法的公共的特性,咱們也能夠定義一個類來描述,這個類就是Method
咱們看下JDK中的定義
一樣是一個普通的類
由上面能夠,那麼Class
類就是經過Field
和Method
來描述類中的字段和方法
咱們來看一下JDK中Class
類中,關於Field和Method
的成員
這些數組就是保存類中的字段或者方法的。
扯遠了,回到開頭,Class類能幹什麼?
既然經過上面咱們知道了,Class類中保存的是全部類的公共特性,那麼是否是咱們經過Class知道某個類中有多少方法,有多少字段,每一個字段叫什麼名字,每一個字段的類型是什麼,每一個方法的方法名是什麼,某個方法有幾個參數,等等
答案是確定的
那如何經過Class知道你說的這些信息呢?
固然是寫代碼啊,好比咱們在程序運行的時候,點擊某個按鈕,打印出某個類的信息,是能夠作到的
既然上面咱們知道了Class
能幹什麼了?下面咱們簡單的瞭解一下,如何使用Class
Class就是一個普通的類啊,使用普通的類就是建立一個對象,才能使用啊
很簡單啊,咱們建立一個Class的對象就好了啊,就能夠調用對象的各類方法了啊
使用就是這麼簡單
咱們先看一下JDK中 Class
類的構造函數
就這一個構造函數,仍是私有的,因此,咱們不能直接new
一個對象了
如何獲取一個Class的對象?
答案:有如下3
種方法,直接上代碼
public static void main(String[] args){ //第一種 Class c1 = String.class; //第二種 String s = "hello,world"; Class c2 = s.getClass(); //第三種,以上面的Book類爲例,其實就是動態加載類,注意捕獲異常,由於類有可能不存在 try { Class c3 = Class.forName("com.test.Book"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
咱們直接經過一個demo來演示更加的直接,以下
package com.example.demo; public class Student { private String name; private int age; public static void main(String[] args){ //通常咱們把Class的對象叫字節碼 Class c = Student.class; // 外部普通類 System.out.println("Student類名是:" + c.getName()); System.out.println("Student類的簡單類名是:" + c.getSimpleName()); System.out.println("Student類有" + c.getDeclaredFields().length + "個字段"); /** * .... * 咱們能夠經過 c (也就是Student這個類的對象,或者你也能夠叫作Student類的字節碼) * 拿到Student類中全部的方法名,方法數,字段名,字段數量,甚至你還能夠經過Method來調用方法 * 只要查查API,熟悉了API,就能作到 * 暫時咱們只打印簡單 */ } }
總結一下:
綜上所述,咱們知道了
關於 Class 的知識就講到這裏,主要是明白 Class 究竟是個什麼東西,剩下的就本身查一下API,寫個demo測試一下就好了。
但願這篇文章能給讀者帶來幫忙