多線程
程序枉昏,進(jìn)程干花,線程:
程序(program)是為完成特定任務(wù)妄帘、用某種語言編寫的一組指令的集合。即指一段靜態(tài)的代碼池凄,靜態(tài)對象抡驼。
進(jìn)程(process)是程序的一次執(zhí)行過程,或是正在運(yùn)行的一個(gè)程序肿仑。是一個(gè)動態(tài)的過程:有它自身的產(chǎn)生致盟、存在和消亡的過程∮任浚——生命周期
如:運(yùn)行中的QQ馏锡,運(yùn)行中的MP3播放器
程序是靜態(tài)的,進(jìn)程是動態(tài)的 進(jìn)程作為資源分配的單位伟端,系統(tǒng)在運(yùn)行時(shí)會為每個(gè)進(jìn)程分配不同的內(nèi)存區(qū)域杯道。
線程(thread),進(jìn)程可進(jìn)一步細(xì)化為線程责蝠,是一個(gè)程序內(nèi)部的一條執(zhí)行路徑党巾。
若一個(gè)進(jìn)程同一時(shí)間并行執(zhí)行多個(gè)線程萎庭,就是支持多線程的。
線程作為調(diào)度和執(zhí)行的單位齿拂,每個(gè)線程擁有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(pc)驳规,線程切換的開銷小 。
一個(gè)進(jìn)程中的多個(gè)線程共享相同的內(nèi)存單元/內(nèi)存地址空間-》它們從同一堆中分配對象署海,可以訪問相同的變量和對象吗购。這就使得線程間通信更簡便、高效砸狞。但多個(gè)線程操作共享的系統(tǒng)資源可能就會帶來安全的隱患巩搏。
使用多線程的優(yōu)點(diǎn)?
背景:以單核CPU為例趾代,只使用單個(gè)線程先后完成多個(gè)任務(wù)(調(diào)用多個(gè)方 法)贯底,肯定比用多個(gè)線程來完成用的時(shí)間更短,為何仍需多線程呢?
何時(shí)需要多線程撒强?
程序需要同時(shí)執(zhí)行兩個(gè)或多個(gè)任務(wù)禽捆。
程序需要實(shí)現(xiàn)一些需要等待的任務(wù)時(shí),如用戶輸入飘哨、文件讀寫操作胚想、網(wǎng)絡(luò)操作、搜索等芽隆。需要一些后臺運(yùn)行的程序時(shí)浊服。
多線程程序的優(yōu)點(diǎn):
1. 提高應(yīng)用程序的響應(yīng)。對圖形化界面更有意義胚吁,可增強(qiáng)用戶體驗(yàn)牙躺。 2. 提高計(jì)算機(jī)系統(tǒng)CPU的利用率
3. 改善程序結(jié)構(gòu)。將既長又復(fù)雜的進(jìn)程分為多個(gè)線程腕扶,獨(dú)立運(yùn)行孽拷,利于理解和修改。
?創(chuàng)建線程的2個(gè)方式
方式1 :繼承 Thread類
示例:
public class TestThread{
??? public static class MyThread extends Thread{
??????? @Override
??????? public void run(){
???????????System.out.printf("%s線程運(yùn)行中\(zhòng)n",Thread.currentThread().getName());
??????? }
??? }
??? public static void main(String[]args) {
??????? MyThreadmyThread = new MyThread();
??????? System.out.printf("在線程 %s 中啟動 myThread\n",Thread.currentThread().getName());
??????? myThread.start();// 注意半抱,不要調(diào)用 run 方法
??? }
}
運(yùn)行結(jié)果:
在線程 main 中啟動myThread
Thread-0 線程運(yùn)行中
可以看到脓恕, Java 入口函數(shù) main 函數(shù)所在線程名為?main,我們一般稱之為主線程窿侈。而我們自定義的線程炼幔,線程名是Thread-序號。上面的工具類Utils中的log方法用到了?Thread.currentThread().getName()?獲取線程名稱史简。
兩個(gè)注意:
[if !supportLists]1.??? [endif]啟動線程乃秀,要用 start 方法,而不是 run 方法。因?yàn)?run 方法是暴露給開發(fā)者寫業(yè)務(wù)邏輯的环形,不會開啟新線程。
[if !supportLists]2.??? [endif]一個(gè)線程對象只能啟動一次衙傀,再次啟動時(shí)會報(bào)錯(cuò)抬吟。
// 一個(gè)線程對象只能啟動一次,再次啟動時(shí)會報(bào)錯(cuò)统抬。
public class TestThread{
??? public static class MyThread extends Thread{
??????? @Override
??????? public void run(){
??????????? Utils.log("線程運(yùn)行中");
??????? }
??? }
??? public static void main(String[]args) {
??????? MyThreadmyThread = new MyThread();
??????? Utils.log("啟動線程");
??????? myThread.start();
??????? Utils.sleep(200);
??????? myThread.start();
??? }
}
執(zhí)行結(jié)果:
[main??????????? ][17:45:38.480]啟動線程
[Thread-0??????? ][17:45:38.492]線程運(yùn)行中
Exception inthread "main" java.lang.IllegalThreadStateException
??? at java.lang.Thread.start(Thread.java:708)
??? at TestThread.main(TestThread.java:15)
方式2:實(shí)現(xiàn) Runnable 接口
示例:
public class TestThread{
??? public static void main(String[]args) {
??????? ThreadmyThread = new Thread(new Runnable(){
??????????? @Override
??????????? public void run(){
???????? ???????Utils.log("線程運(yùn)行中");
??????????? }
??????? });
??????? Utils.log("啟動線程");
??????? myThread.start();
??? }
}
或者簡化為 lambda 形式:
public class TestThread{
??? public static void main(String[]args) {
??????? ThreadmyThread = new Thread(()-> Utils.log("線程運(yùn)行中"));
??????? Utils.log("啟動線程");
??????? myThread.start();
??? }
}
運(yùn)行結(jié)果示例:
[main??????????? ][17:55:42.383]啟動線程
[Thread-0??????? ][17:55:42.395]線程運(yùn)行中
自定義線程名稱
使用?setName方法可以自定義線程名稱火本。
示例:
public class TestThread{
??? public static void main(String[]args) {
??????? Threadt1 = new Thread(()->{
??????????? Utils.log("t1線程運(yùn)行中");
??????? });
??????? Threadt2 = new Thread(()->{
??????????? Utils.log("t2線程運(yùn)行中");
??????? });
??????? Utils.log("主線程: 自定義線程名");
??????? t1.setName("自定義線程名");
??????? Thread.currentThread().setName("自定義主線程名");
??????? Utils.log("主線程: 啟動線程t1, t2");
??????? t1.start();
??????? t2.start();
??? }
}
運(yùn)行結(jié)果:
[main??????????? ][18:29:45.381]主線程: 自定義線程名
[自定義主線程名???????? ][18:29:45.396]主線程: 啟動線程t1, t2
[自定義線程名????????? ][18:29:45.396] t1線程運(yùn)行中
[Thread-1??????? ][18:29:45.396] t2線程運(yùn)行中
常用類
字符串相關(guān)的類:String
在 java 中,枚舉類型是一種特殊數(shù)據(jù)類型聪建,能夠?yàn)橐粋€(gè)變量定義一組預(yù)定義的常量钙畔。變量必須等于為其預(yù)定義的值之一。
String的特性
lString類:代表字符串金麸。Java 程序中的所有字符串字面值(如"abc" )都作 為此類的實(shí)例實(shí)現(xiàn)擎析。
lString是一個(gè)final類,代表不可變的字符序列挥下。l字符串是常量揍魂,用雙引號引起來表示。它們的值在創(chuàng)建之后不能更改棚瘟。 lString對象的字符內(nèi)容是存儲在一個(gè)字符數(shù)組value[]中的现斋。
public final class String
implements java.io.Serializable,Comparable, CharSequence {/** Thevalue is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash;// Default to 0
String對象的創(chuàng)建
String str ="hello";
//本質(zhì)上this.value
= new char[0]; String s1 = new String();
//this.value = original.value;
String s2 = newString(String original);//this.value
= Arrays.copyOf(value, value.length);
String s3 = newString(char[] a);
String s4 = newString(char[] a,int startIndex,int count);
JDK8中新日期時(shí)間API
java.time – 包含值對象的基礎(chǔ)包java.time.chrono – 提供對不同的日歷系統(tǒng)的訪問
java.time.format – 格式化和解析時(shí)間和日期 java.time.temporal – 包括底層框架和擴(kuò)展特性
java.time.zone – 包含時(shí)區(qū)支持的類
LocalDate、LocalTime偎蘸、LocalDateTime 類是其中較重要的幾個(gè)類庄蹋,它們的實(shí)例是不可變的對象,分別表示使用ISO-8601日歷系統(tǒng)的日期迷雪、時(shí)間限书、日期和時(shí)間。 它們提供了簡單的本地日期或時(shí)間章咧,并不包含當(dāng)前的時(shí)間信息蔗包,也不包含與時(shí)區(qū)
相關(guān)的信息。
?LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存儲 生日慧邮、紀(jì)念日等日期调限。?LocalTime表示一個(gè)時(shí)間,而不是日期误澳。?LocalDateTime是用來表示日期和時(shí)間的耻矮,這是一個(gè)最常用的類之一。
注:ISO-8601日歷系統(tǒng)是國際標(biāo)準(zhǔn)化組織制定的現(xiàn)代公民的日期和時(shí)間的表示 法忆谓,也就是公歷裆装。
枚舉類
枚舉類的使用
l枚舉類的實(shí)現(xiàn)
?JDK1.5之前需要自定義枚舉類?JDK 1.5 新增的enum 關(guān)鍵字用于定義枚舉類
l若枚舉只有一個(gè)對象, 則可以作為一種單例模式的實(shí)現(xiàn)方 式。
l 枚舉類的屬性
?枚舉類對象的屬性不應(yīng)允許被改動, 所以應(yīng)該使用private final 修飾
?枚舉類的使用 private final 修飾的屬性應(yīng)該在構(gòu)造器中為其賦值
?若枚舉類顯式的定義了帶參數(shù)的構(gòu)造器, 則在列出枚舉值時(shí)也必須對應(yīng)的 傳入?yún)?shù)。
自定義枚舉類
1. 私有化類的構(gòu)造器哨免,保證不能在類的外部創(chuàng)建其對象2. 在類的內(nèi)部創(chuàng)建枚舉類的實(shí)例茎活。聲明為:publicstatic final
3. 對象如果有實(shí)例變量,應(yīng)該聲明為privatefinal琢唾,并在構(gòu)造器中初始化
[if !vml]
[endif]
Java集合
Java 集合可分為 Collection 和 Map 兩種體系
?Collection接口:單列數(shù)據(jù)载荔,定義了存取一組對象的方法的集合üList:元素有序、可重復(fù)的集合 üSet:元素?zé)o序采桃、不可重復(fù)的集合
? Map接口:雙列數(shù)據(jù)懒熙,保存具有映射關(guān)系“key-value對”的集合
Collection接口
lCollection 接口是 List、Set 和 Queue 接口的父接口普办,該接口里定義的方法 既可用于操作 Set 集合工扎,也可用于操作 List 和 Queue 集合。
lJDK不提供此接口的任何直接實(shí)現(xiàn)衔蹲,而是提供更具體的子接口(如:Set和List) 實(shí)現(xiàn)肢娘。
l在 Java5 之前,Java 集合會丟失容器中所有對象的數(shù)據(jù)類型舆驶,把所有對象都 當(dāng)成 Object 類型處理;從JDK 5.0 增加了泛型以后蔬浙,Java 集合可以記住容 器中對象的數(shù)據(jù)類型。
Collection接口方法:
贞远、添加? add(Objectobj)
? addAll(Collection
coll)
2畴博、獲取有效元素的個(gè)數(shù) ? int
size()
3、清空集合? void
clear()
4蓝仲、是否是空集合? boolean
isEmpty()
5俱病、是否包含某個(gè)元素? boolean
contains(Object obj):是通過元素的equals方法來判斷是否是同一個(gè)對象?boolean containsAll(Collection c):也是調(diào)用元素的equals方法來比較的。拿兩個(gè)集合的元素挨個(gè)比較袱结。
6.刪除
? ?boolean remove(Object obj) :通過元素的equals方法判斷是否是
[if !supportLists]·??????[endif]???要刪除的那個(gè)元素亮隙。只會刪除找到的第一個(gè)元素
? ?boolean removeAll(Collection coll):取當(dāng)前集合的差集
7、取兩個(gè)集合的交集? boolean
retainAll(Collection c):把交集的結(jié)果存在當(dāng)前集合中垢夹,不影響溢吻。
8、集合是否相等
? booleanequals(Object obj)
9果元、轉(zhuǎn)成對象數(shù)組
? Object[]toArray()
10促王、獲取集合對象的哈希值
? hashCode()
11、遍歷
? iterator():返回迭代器對象而晒,用于集合遍歷
泛型
Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類型安全檢測機(jī)制蝇狼,該機(jī)制允許程序員在編譯時(shí)檢測到非法的類型。
泛型的本質(zhì)是參數(shù)化類型倡怎,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)迅耘。
泛型方法
你可以寫一個(gè)泛型方法贱枣,該方法在調(diào)用時(shí)可以接收不同類型的參數(shù)。根據(jù)傳遞給泛型方法的參數(shù)類型颤专,編譯器適當(dāng)?shù)靥幚砻恳粋€(gè)方法調(diào)用纽哥。
下面是定義泛型方法的規(guī)則:
[if !supportLists]·?????? [endif]所有泛型方法聲明都有一個(gè)類型參數(shù)聲明部分(由尖括號分隔),該類型參數(shù)聲明部分在方法返回類型之前(在下面例子中的<E>)栖秕。
[if !supportLists]·?????? [endif]每一個(gè)類型參數(shù)聲明部分包含一個(gè)或多個(gè)類型參數(shù)春塌,參數(shù)間用逗號隔開。一個(gè)泛型參數(shù)累魔,也被稱為一個(gè)類型變量,是用于指定一個(gè)泛型類型名稱的標(biāo)識符够滑。
[if !supportLists]·?????? [endif]類型參數(shù)能被用來聲明返回值類型垦写,并且能作為泛型方法得到的實(shí)際參數(shù)類型的占位符。
[if !supportLists]·?????? [endif]泛型方法體的聲明和其他方法一樣彰触。注意類型參數(shù)只能代表引用型類型梯投,不能是原始類型(像int,double,char的等)。
實(shí)例
下面的例子演示了如何使用泛型方法打印不同字符串的元素:
public classGenericMethodTest
{
?? // 泛型方法printArray????????????????????????
???public static < E > void printArray( E[] inputArray )
?? {
????? // 輸出數(shù)組元素???????????
?????????for( E element : inputArray ){???????
????????????System.out.printf( "%s ", element );
???????? }
???????? System.out.println();
??? }
????public static void main( String args[] )
??? {
??????? // 創(chuàng)建不同類型數(shù)組: Integer, Double 和 Character
??????? Integer[] intArray = {1, 2, 3, 4, 5};
??????? Double[] doubleArray = {1.1, 2.2, 3.3, 4.4};
??????? Character[] charArray = {'H', 'E', 'L', 'L', 'O'};
????????System.out.println( "整型數(shù)組元素為:");
?????? ?printArray( intArray? );// 傳遞一個(gè)整型數(shù)組
????????System.out.println( "\n雙精度型數(shù)組元素為:");
??????? printArray( doubleArray );// 傳遞一個(gè)雙精度型數(shù)組
????????System.out.println( "\n字符型數(shù)組元素為:");
??????? printArray( charArray );// 傳遞一個(gè)字符型數(shù)組
??? }
}
[if !supportLineBreakNewLine]
[endif]
編譯以上代碼况毅,運(yùn)行結(jié)果如下所示:
整型數(shù)組元素為:
1 2 3 4 5
雙精度型數(shù)組元素為:
1.1 2.2 3.3 4.4
字符型數(shù)組元素為:
H E L L O
有界的類型參數(shù):
可能有時(shí)候分蓖,你會想限制那些被允許傳遞到一個(gè)類型參數(shù)的類型種類范圍。例如尔许,一個(gè)操作數(shù)字的方法可能只希望接受Number或者Number子類的實(shí)例么鹤。這就是有界類型參數(shù)的目的。
要聲明一個(gè)有界的類型參數(shù)味廊,首先列出類型參數(shù)的名稱蒸甜,后跟extends關(guān)鍵字,最后緊跟它的上界余佛。
實(shí)例
下面的例子演示了"extends"如何使用在一般意義上的意思"extends"(類)或者"implements"(接口)柠新。該例子中的泛型方法返回三個(gè)可比較對象的最大值。
public classMaximumTest
{
?? // 比較三個(gè)值并返回最大值
?? public static <T extends Comparable<T>> T maximum(T x, T y, T z)
?? {????????????????????
??????T max = x;// 假設(shè)x是初始最大值
?????if ( y.compareTo( max ) > 0){
???????? max = y;//y 更大
????? }
????? if ( z.compareTo( max ) > 0){
???????? max = z;// 現(xiàn)在 z 更大??????????
??????}
????? return max; // 返回最大對象
?? }
?? public static void main( String args[] )
?? {
????? System.out.printf( "%d, %d 和 %d 中最大的數(shù)為 %d\n\n",
?????????????????? 3, 4, 5, maximum( 3, 4, 5) );
??????System.out.printf( "%.1f, %.1f 和 %.1f 中最大的數(shù)為 %.1f\n\n",
?????????????????? 6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7) );
??????System.out.printf( "%s, %s 和 %s 中最大的數(shù)為 %s\n","pear",
???????? "apple", "orange", maximum( "pear", "apple", "orange") );
?? }
}
[if !supportLineBreakNewLine]
[endif]
編譯以上代碼辉巡,運(yùn)行結(jié)果如下所示:
3, 4 和 5 中最大的數(shù)為5
6.6, 8.8 和 7.7 中最大的數(shù)為8.8
pear, apple 和 orange 中最大的數(shù)為pear
泛型類
泛型類的聲明和非泛型類的聲明類似恨憎,除了在類名后面添加了類型參數(shù)聲明部分。
和泛型方法一樣郊楣,泛型類的類型參數(shù)聲明部分也包含一個(gè)或多個(gè)類型參數(shù)憔恳,參數(shù)間用逗號隔開。一個(gè)泛型參數(shù)净蚤,也被稱為一個(gè)類型變量喇嘱,是用于指定一個(gè)泛型類型名稱的標(biāo)識符。因?yàn)樗麄兘邮芤粋€(gè)或多個(gè)參數(shù)塞栅,這些類被稱為參數(shù)化的類或參數(shù)化的類型者铜。
實(shí)例
如下實(shí)例演示了我們?nèi)绾味x一個(gè)泛型類:
public classBox {
??privateT t;
??public void add(T t) {
??? this.t = t;
? }
??public T get() {
??? returnt;
? }
??public static void main(String[] args) {
??? Box integerBox =newBox();
??? Box stringBox =newBox();
????integerBox.add(new Integer(10));
??? stringBox.add(new String("菜鳥教程"));
????System.out.printf("整型值為 :%d\n\n", integerBox.get());
??? System.out.printf("字符串為 :%s\n", stringBox.get());
? }
}
[if !supportLineBreakNewLine]
[endif]
編譯以上代碼腔丧,運(yùn)行結(jié)果如下所示:
整型值為:10
字符串為 :菜鳥教程
類型通配符
1、類型通配符一般是使用?代替具體的類型參數(shù)作烟。例如List<?>在邏輯上是List<String>,List<Integer>?等所有List<具體類型實(shí)參>的父類愉粤。
import java.util.*;
public classGenericTest {
????public static void main(String[] args) {
??????? List name =newArrayList();
??????? List age =newArrayList();
??????? List number =newArrayList();
????????name.add("icon");
??????? age.add(18);
??????? number.add(314);
????????getData(name);
??????? getData(age);
??????? getData(number);
???}
???public static void getData(List data) {
????? System.out.println("data :" + data.get(0));
?? }
}
[if !supportLineBreakNewLine]
[endif]
輸出結(jié)果為:
data :icon
data :18
data :314
解析:?因?yàn)間etData()方法的參數(shù)是List>類型的,所以name拿撩,age衣厘,number都可以作為這個(gè)方法的實(shí)參,這就是通配符的作用
2压恒、類型通配符上限通過形如List
extends Number>來定義影暴,如此定義就是通配符泛型值接受Number及其下層子類類型。
import java.util.*;
public classGenericTest {
????public static void main(String[] args) {
??????? List name =newArrayList();
??????? List age =newArrayList();
??????? List number =newArrayList();
????????name.add("icon");
??????? age.add(18);
??????? number.add(314);
????????//getUperNumber(name);//1
??????? getUperNumber(age);//2
??????? getUperNumber(number);//3
???}
???public static void getData(List data) {
????? System.out.println("data :" + data.get(0));
?? }
???public static void getUperNumber(List data) {
????????? System.out.println("data :" + data.get(0));
?????? }
}
[if !supportLineBreakNewLine]
[endif]
輸出結(jié)果:
data :18
data :314
解析:?在(//1)處會出現(xiàn)錯(cuò)誤探赫,因?yàn)間etUperNumber()方法中的參數(shù)已經(jīng)限定了參數(shù)泛型上限為Number型宙,所以泛型為String是不在這個(gè)范圍之內(nèi),所以會報(bào)錯(cuò)
3伦吠、類型通配符下限通過形如List<?
super Number>來定義妆兑,表示類型只能接受Number及其三層父類類型,如Objec類型的實(shí)例毛仪。
Io流
網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序搁嗓,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。
Java
IO原理
lI/O是Input/Output的縮寫箱靴, I/O技術(shù)是非常實(shí)用的技術(shù)腺逛,用于處理設(shè)備之間的數(shù)據(jù)傳輸。如讀/寫文件衡怀,網(wǎng)絡(luò)通訊等屉来。
lJava程序中,對于數(shù)據(jù)的輸入/輸出操作以“流(stream)”的 方式進(jìn)行狈癞。
ljava.io包下提供了各種“流”類和接口茄靠,用以獲取不同種類的 數(shù)據(jù),并通過標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)蝶桶。
反射機(jī)制
JavaReflection
lReflection(反射)是被視為動態(tài)語言的關(guān)鍵慨绳,反射機(jī)制允許程序在執(zhí)行期 借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意對象的內(nèi) 部屬性及方法真竖。
l加載完類之后脐雪,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個(gè)Class類型的對象(一個(gè) 類只有一個(gè)Class對象),這個(gè)對象就包含了完整的類的結(jié)構(gòu)信息恢共。我們可以通過這個(gè)對象看到類的結(jié)構(gòu)战秋。這個(gè)對象就像一面鏡子,透過這個(gè)鏡子看 到類的結(jié)構(gòu)讨韭,所以脂信,我們形象的稱之為:反射癣蟋。
補(bǔ)充:動態(tài)語言vs靜態(tài)語言
1、動態(tài)語言 是一類在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)狰闪、對象疯搅、甚至代碼可以
被引進(jìn),已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化埋泵。通俗點(diǎn)說就是在運(yùn) 行時(shí)代碼可以根據(jù)某些條件改變自身結(jié)構(gòu)幔欧。 主要動態(tài)語言:Object-C、C#丽声、JavaScript礁蔗、PHP、Python雁社、Erlang浴井。
2、靜態(tài)語言 與動態(tài)語言相對應(yīng)的歧胁,運(yùn)行時(shí)結(jié)構(gòu)不可變的語言就是靜態(tài)語言滋饲。如Java厉碟、C喊巍、 C++。
Java不是動態(tài)語言箍鼓,但Java可以稱之為“準(zhǔn)動態(tài)語言”崭参。即Java有一定的動 態(tài)性,我們可以利用反射機(jī)制款咖、字節(jié)碼操作獲得類似動態(tài)語言的特性何暮。 Java的動態(tài)性讓編程的時(shí)候更加靈活!
反射相關(guān)的主要API
l java.lang.Class:代表一個(gè)類ljava.lang.reflect.Method:代表類的方法ljava.lang.reflect.Field:代表類的成員變量ljava.lang.reflect.Constructor:代表類的構(gòu)造器 l......