Java的高階特性反射
首先簡單說說什麼反射,其實就是動態的載入類,我們在寫JDBC的時候載入驅動Class.forName("xxxx"),這句話就涉及到了反射。
反射是自JAVA誕生就具備的高階特性,其強大的擴充套件能力使JAVA嚴謹死板的語法變得靈活。
但是能夠超越一些JAVA對普通類的限定,有關反射主要相關的包在java.lang.reflect中。
但是反射也有缺點,就是結構程式碼較為複雜,使人難以理解,在程式設計中應當注視上普通的實現方式。
由於反射將一個類的各種成分都對映成了相應的類和物件,所以相對普通方法來說,比較消耗資源。
為什麼要學習反射呢?
因為其強大的擴充套件性,在java開發中框架(Spring)大量應用了反射,反射是Java開發者非常有必要掌握的一門技能。
Java的反射機制主要提供了:
在執行時判斷任意一個物件的所屬的類。
在執行時判斷構造任意一個類的物件。
在執行時判斷任意一個類所具有的成員變數和方法。
在執行時呼叫任意一個物件的方法。
Class類(反射的基石)
Java中每個類都代表了一類事物,如Person類可以有張三李四的具體物件
Class是用於描述JAVA類的一個類,代表類的位元組碼例項物件
一個類被載入器載入到記憶體中,佔用一片儲存空間,在這個空間裡的內容就是類的位元組碼
這樣一個個空間可以用一類物件來表示,這些物件具備相同的型別,這個型別就是CLASS
//不同類的位元組碼是不同的,所以他們在記憶體中的內容也是不同的
java類的用於描述一類事物的共性,該類的屬性是由該類的例項物件來決定的,不同的例項物件具備不同的屬性
java程式中的各個JAVA類也屬於同一類事物,而CLASS類就是用於描述這類事物的
Class 類描述了類的屬性資訊,如類名、訪問許可權、包名、欄位名稱列表、方法名稱列表等
學習反射就要先搞清楚 Class 這個類
獲取各個位元組碼對應例項物件(class型別)的方法
1.類名.class ;如:Class c1= Person.class;
2.物件.getClass();如:new Date().getClass();
3.class.forName("類名");如:Class.forName("java.lang.String");
反射時主要用第三種,因為可以將表示“類名”的字串定義一個變數
得到類的位元組方式
1.該類的位元組碼已經載入到了記憶體中,直接找到類的位元組碼返回(如上1,2)
2.虛擬機器中沒有該位元組碼,用類載入器載入,將該位元組碼快取起來同時返回(如3)
Class類的例項表示正在執行的JAVA應用程式中的類和介面。列舉是一種類,註釋是一種介面。
每個陣列屬於被對映為 Class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件。
基本的 Java 型別(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 物件。
Class 沒有公共構造方法。Class 物件是在載入類時由 Java 虛擬機器以及通過呼叫類載入器中的 defineClass 方法自動構造的。
九個預定義Class例項物件
(八個基本資料型別+ void )每個型別都對應了一個 Class 例項物件
Class c1 = void.class;
Class 類方法
isPrimitive();//判斷該位元組碼是否是基本資料型別
包裝類不屬於基本資料型別,但是可以通過 TYPE 常量獲取其基本資料型別位元組碼;
如:Integer.TYPE 與 int.class 是同一個位元組碼物件
陣列型別的Class例項物件判斷方法: Class.isArray()
只要是在源程式中出現的型別,都有各自 Class 例項物件,如:int[],void
----------------------------------------------------------------------
"反射->Refelection"
反射並不是1.5版本才出現的,始於1.0,是java最重要的高階特性之一
概念:反射就是把Java類中的各種成分對映成相應的java類
例如:Java中一個類可以用Class類的一個物件來表示
一個類的組成部分:成員變數、方法、構造方法、包等資訊也用一個個的Java類來表示
//就像汽車是一個類,汽車中的發動機、變速箱等組成也是一個個類
表示Java類的Class類顯然要提供一系列的方法,來獲得其中的變數、方法、構造方法、修飾符、包等資訊
這些資訊就是用相應類的例項物件來表示,這些類是: Field,Method,Constructor,Package 等
一個類中的每一個成員都可以用相應的反射API類的例項物件來表示,通過呼叫 Class 類的方法可以得到這些例項物件
'得到這些例項物件後該怎麼用,是學習應用反射的要點'
例如;
System.exit
System.getProperties()
Method --> nethodObj1 可以使用兩個 Method 物件來代表 System 類的兩個方法
methodOjb2 //Method代表方法這個型別,其物件代表具體是哪個方法
-----------------------------------------------
Constructor 類 代表某個類中的構造方法
獲取某個類所有的構造方法 // []陣列,s獲取多個
示例: Constructor[] constructor = Class.forName("java.lang.String").getConstructors();
1,獲取某一個構造方法 //可變引數
示例: Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//獲得構造方法時要用到型別
2,建立例項物件
通常方式: String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc "));//實參
//呼叫方法時要用到上面相同型別的例項物件
Class.newInstance()方法:
ep: String obj = (String)Class.forName("java.lanng.String").newInstance(); //空參
該方法首先得到預設的無參構造方法,然後使用該構造方法建立例項物件
該方法在內部使用了快取機制來儲存預設構造方法的例項物件,所以會影響效能
只有兩個類擁有newInstance()方法,分別是 Class 類和 Constructor 類
Class類中的newInstance()方法是不帶引數的,而Constructro類中的newInstance()方法是帶引數的(Object),
需要提供必要的引數。 在程式設計時要擇需使用
構造方法的反射: class-->constructor-->new object 通過兩個步驟獲取該類的物件
-----------------------------------------------------------------------------------------------
Field 類
Field類代表某個類中的一個成員變數, 設有一個obj物件
Field物件不是obj具體的變數值,而是指代的是obj所屬類的哪一個變數,可以通過Field(物件).get(obj)獲取相應的變數值
示例: Field field = obj.getClass().getField("變數名")
field.get(obj) //通過反射獲取物件的變數值,引數是物件,意思就是獲得那個物件的那個變數的值
步驟: 1)獲取class位元組碼 2)獲取指定的Field物件 3)獲取變數值
"暴力反射"
get方法只能獲取宣告為 public 的變數,對於私有變數,可以通過getDeclaredField()方法獲取 private 變數
獲取物件後要通過 setAccessible(true)方法將該域設定為可訪問
示例: Field field = obj.getClass().getDeclaredField(); //1)2)獲取私有file物件
field.setAccessible(true); //3)將private變數設定為可訪問;繼承自父類 AccessibleObject 的方法
1).反射 通過反射的方式可以獲取class物件中的屬性、方法、建構函式等,一下是例項: 2).動態代理 使用場景:
在之前的程式碼呼叫階段,我們用action呼叫service的方法實現業務即可。 由於之前在service中實現的業務可能不能夠滿足當先客戶的要求,需要我們重
黑馬程式設計師—–Java高階特性—–反射
一.概述
Java 反射是Java語言的一個很重要的特徵,它使得Java具體了“動態性”。
這個機制允許程式在執行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其mod
目錄第4天 java高階特性增強今天內容安排:1、掌握多執行緒2、掌握併發包下的佇列3、瞭解JMS4、掌握JVM技術5、掌握反射和動態代理Øjava多執行緒增強通俗來講:應用程式就是一個程序。不管是我們開發的應用程式,還是我們執行的其他的應用程式,都需要先把程式安裝在本地的硬
---------------------------------------- android培訓、java培訓、期待與您交流!
------------------------------------
首先簡單說說什麼反射,其實就是動態的載入類,我們在寫JD
獲取父類的泛型
java反射概述
java Reflection,java中的反射(Reflection)被認為是動態語言的關鍵,反射機制允許程式在執行期藉助Reflection API取得任何類的內部資訊。並且能直接操作任意物件的內部屬性和方法。
簡單來 1).synchronized 加同步格式: synchronized( 需要一個任意的物件(鎖) ){ 程式碼塊中放操作共享資料的程式碼。 } synchronized的缺陷 synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。 繼承
繼承是面向物件的三大特徵之一,也是實現軟體複用的一個手段。java的繼承具有單繼承的特點(簡單理解一個兒子只能有一個爸爸),每個子類只有一個直接父類,但是一類可以有多個子類(除final型別的類)。
繼承的特點:
java的繼承通過extends 關鍵字來實現,實現繼承的類 內部類概念
public class Outer{
class inner{
}
}
特點
可以很好的實現隱藏,可以使用procted,private
可以直接訪問外部類的所有成員 ,包括私有成員.
外部內不 基本資料型別轉換為引用型別物件
一個自動裝箱的例子
Integer i=10;
相當於 Integer i=new Integer(10);
一個自動拆箱的例子
Integer m=10;
int n=m;
相當於n=m.intValue();
String
String物件一旦建立就不能改變 是常量
需要進行大量字串操作應採用StringBuffer/StringBuilder 最終結果轉換成String物件
StringBuffer
執行緒安全的 可變字元序列
一個類似於String的字串緩衝區(字元
package three.day.newcharacter;
class Outer
{public static final int height = 20;public static int weight = 20;private int num = 100;//內建
1. 什麼是內部類(InnerClass)?
一個類中巢狀著另一個類,這樣的類就叫內部類.
語法:
class outClass{
public class innerClass{
}
}
2. 內部類的 一、static
static關鍵字經常以修飾變數、程式碼等形式和構造器、父類構造器一起出現在筆試題中,首先了解static能修飾哪些東西。
1.static變數
static變數既是在例項變數的前面加個static,一般稱為靜態變數。
靜態變數和例項變數的區別在於給類建立例項時,靜態
import java.io.*;
/**
* 將圖片轉為陣列,輸出成檔案,再讀取這個檔案,獲得這個陣列,還原成圖片
* @author Administrator
*
*
*/
public class Text3 {
public static void main(String[
要求:使用XML儲存圖書資訊,使用DOM4J操作XML,進行圖書的增刪改查。
使用技術:XML/DOM4j/集合/物件
部分實現效果如果下:
實現思路
首先需要建立一個圖書類(Book類),儲存圖書的屬性(屬性和XML檔案一致,因
java多執行緒知識點:
1、建立分執行緒的方式
2、單例模式懶漢式執行緒安全問題
3、java執行緒同步
4、java執行緒通訊
5、java的記憶體模型
認識執行緒:
每一個java程式都有一個隱含的主執行緒,即main()方法。
程式–&g
一、什麼是反射?
它是指在PHP執行狀態中,擴充套件分析PHP程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括註釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射API。
反射是操縱面向物件範型中元模型的API,其功能十分強大,可幫助我們
1.從控制檯輸入字串,字串的長度必須為是6,如果輸入的字元長度不等於6,則重新輸入。import java.util.Scanner;
public class Alphabetic {
public static void main(String[] args)
01.Enum不可以有public或者protected的構造方法,只能是private或friendly(就前面不用修飾符),這樣可以保證客戶程式碼不能新建一個Enum的例項,我們也不需要例項化Enum物件。
Enum定義的列表成員跟介面一樣都是public,sta
1.建立類Queue,代表隊列(特點:先進先出),新增add()及get()方法,並新增main()進行效果驗證。package kenhouzuoye;
public class Queue {
String name;//姓名
int avg;//年齡
publi 相關推薦
Java高階特性—反射和動態代理
黑馬程式設計師-------Java高階特性--------反射
Java高階特性(動態代理和反射)
Java的高階特性反射
java高階特性之反射
Java高階特性—鎖
java高階特性 (繼承)
JAVA高階特性--內部類
JAVA高階特性--自動拆箱-裝箱,列舉型別
JAVA高階特性--String/StringBuffer/Builder
Java高階特性之new一個內部類
Java高階特性之內部類
Java高階特性(一)
JAVA高階特性——二進位制儲存圖片
JAVA高階特性——迷你圖書管理系統(DOM4J操作儲存集合中的物件)
java高階特性之多執行緒
php高階特性-反射
java高階特性與實戰專案 ——第二章:實用類 課後作業:
Java高階特性之列舉(二)
JAVA高階特性第一章課後習題