1. 程式人生 > >黑馬程式設計師-java高新技術(反射)

黑馬程式設計師-java高新技術(反射)

一、反射
1、定義:
Java程式中的各個Java類屬於統一類事物,描述這類事物的Java類名就是Class。反射機制指的是程式在執行時能夠獲取自身的資訊。在java中,只要給定類的名字,那麼就可以通過反射機制來獲得類的所有資訊。
2、優點和缺點:
優點:
可以實現動態建立物件和編譯,體現出很大的靈活性,特別是在J2EE的開發。
缺點:
對效能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作。
3、Class物件
T - 由此 Class 物件建模的類的型別。
常用方法:
(1)forName(String className)
返回與帶有給定字串名的類或介面相關聯的 Class 物件。
(2)getClasses()
返回一個包含某些 Class 物件的陣列,這些物件表示屬於此 Class 物件所表示的類的成員的所有公共類和介面。
(3)isPrimitive()
判定指定的 Class 物件是否表示一個基本型別。
(4)newInstance()
建立此 Class 物件所表示的類的一個新例項。
(5)getField(String name)
返回一個 Field 物件,它反映此 Class 物件所表示的類或介面的指定公共成員欄位。
(6)getMethod(String name, Class parameterTypes)
返回一個 Method 物件,它反映此 Class 物件所表示的類或介面的指定公共成員方法。
(7)getConstructors()
返回一個包含某些 Constructor 物件的陣列,這些物件反映此 Class 物件所表示的類的所有公共構造方法。
4、建構函式
Constructor 提供關於類的單個構造方法的資訊以及對它的訪問許可權。
常用方法:
(1)getName()
以字串形式返回此構造方法的名稱。
(2)newInstance(Object… initargs)
使用此 Constructor 物件表示的構造方法來建立該構造方法的宣告類的新例項,並用指定的初始化引數初始化該例項。
5、欄位
Field 提供有關類或介面的單個欄位的資訊,以及對它的動態訪問許可權。反射的欄位可能是一個類(靜態)欄位或例項欄位。
常用方法:
(1)get(Object obj)
返回指定物件上此 Field 表示的欄位的值。
(2)getName()
返回此 Field 物件表示的欄位的名稱。
(3)set(Object obj, Object value)
將指定物件變數上此 Field 物件表示的欄位設定為指定的新值。
6、方法
Method 提供關於類或介面上單獨某個方法(以及如何訪問該方法)的資訊。所反映的方法可能是類方法或例項方法(包括抽象方法)。
常用方法:
(1)getName()
以 String 形式返回此 Method 物件表示的方法名稱。
(2)invoke(Object obj, Object… args)
對帶有指定引數的指定物件呼叫由此 Method 物件表示的底層方法。

程式碼塊

練習:反射常用練習

package com.itheima5;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
 * Class ---> 代表一類什麼樣的事物?
 * 
 * Person p1 = new Person();
 * Person p2 = new Person();
 * 
 * Class cls1 = Date.class
//位元組碼1; * Class cls2 = Person.class//位元組碼2; * * p1.getClass(); * * Class.forName("java.lang.String"); * * 載入位元組碼的方法: * 類名.class * 物件.getClass(),例如:new Date().getClass() * Class.forName("類名"),例如:Class.forName("java.util.Date") * * * 反射:就是把Java類中的各種成分對映成相應的Java類。 * * * * Constructor類 * Constructor[] constructors = Class.forName("java.lang.String"
).getConstructors(); * * class->constructor->new object * * ClassDemo物件 * @author jjy * * */ public class ReflectTest{ public static void main(String[] args)throws Exception{ String str1 = "abc"; /** * 獲得Class物件 */ Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1==cls2); System.out.println(cls1==cls3); System.out.println(cls1.isPrimitive()); System.out.println(int.class.isPrimitive()); System.out.println(int.class == Integer.class); System.out.println(int.class == Integer.TYPE); System.out.println(int[].class.isPrimitive()); System.out.println(int[].class.isArray()); /** * 呼叫建構函式 */ //new String(new StringBuffer("abc")); Constructor constructor1 = String.class.getConstructor(StringBuffer.class); String str2 = (String)constructor1.newInstance(new StringBuffer("abc")); System.out.println(str2.charAt(2)); /** * 獲得欄位:field */ ReflectPoint pt1 = new ReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); //fieldY的值是多少?是5,錯! //field不是物件身上的變數,而是類上, System.out.println(fieldY.get(pt1)); Field fieldY11 = pt1.getClass().getField("y"); Field fieldX = pt1.getClass().getDeclaredField("x"); fieldX.setAccessible(true); System.out.println(fieldX.get(pt1)); changeStringValue(pt1); System.out.println(pt1); /** * 獲得方法:Method() */ Method methodCharAt = String.class.getMethod("charAt", int.class); System.out.println(methodCharAt.invoke(str1, 1)); System.out.println(methodCharAt.invoke(str1, new Object[]{2})); //TestArguments.main(new String[]{"111","222","333"}); String startingClassName = args[0]; Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class); mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}}); /** * array */ int[] a1 = new int[3]; int[] a2 = new int[4]; int[][] a3 = new int[2][3]; String[] a4 = new String[3]; System.out.println(a1.getClass() == a2.getClass()); System.out.println(a1.getClass().getName()); System.out.println(a1.getClass().getSuperclass().getName()); Object aObj1 = a1; //Object[] aObj5 = a1;//就是int型,不能是Object Object[] aObj2 = a4; Object[] aObj3 = a3; Object[] aObj4= a4; System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); /** * 在看視訊的時候,老師定義了幾個陣列,然後進行比較,在Eclipse中程式碼不報錯,但是,我自己執行的時候,出現瞭如下錯誤: Incompatible operand types Class<capture#8-of ? extends int[]> and Class<capture#9-of ? extends int[][]> 解析:查閱了網上的資料,解釋如下: 對於陣列型別的變數編譯器在編譯時,其實已經知道型別了。也就是說,編譯器認為這2個型別是不一樣的。根本沒有比較的需要。 對於總是不成立的比較,其實是沒有意義的。這個編譯錯誤是 JDK 1.6的新功能 而老師使用的恰好是JDK1.5的版本,我使用的是1.6版本。 */ //System.out.println(a1.getClass() == a4.getClass()); //System.out.println(a1.getClass() == a3.getClass()); Object obj = null; printObject(obj); } private static void printObject(Object obj){ Class clazz = obj.getClass(); if(clazz.isArray()){ int len = Array.getLength(obj); for(int i=0;i<len;i++){ System.out.println(Array.get(obj, i)); } }else{ System.out.println(obj); } } private static void changeStringValue(Object obj)throws Exception{ Field[] fields = obj.getClass().getFields(); for(Field field:fields){ //if(field.getType().equals(String.class)) if(field.getType() == String.class){ String oldValue = (String)field.get(obj); String newValue = oldValue.replace("b", "a"); field.set(obj, newValue); } } } } class TestArguments{ public static void main(String[] args){ for(String arg:args){ System.out.println(arg); } } }

執行結果:
true
true
false
true
false
true
false
true
c
5
3
aall:aasketaall:itcast
b
c
111
222
333
true
[I
java.lang.Object
[[[email protected]]
[null, null, null]

相關推薦

黑馬程式設計師-java高新技術反射

一、反射 1、定義: Java程式中的各個Java類屬於統一類事物,描述這類事物的Java類名就是Class。反射機制指的是程式在執行時能夠獲取自身的資訊。在java中,只要給定類的名字,那麼就可以通過反射機制來獲得類的所有資訊。 2、優點和缺

黑馬程式設計師——Java高新技術_反射

反射技術: 其實就是動態載入一個指定的類,並獲取該類中的所有的內容。而且將位元組碼檔案封裝成物件,並將位元組碼檔案中的內容都封裝成物件,這樣便於操作這些成員。簡單說:反射技術可以對一個類進行解剖。 反射的好處:大大的增強了程式的擴充套件性。 反射的基本步驟: 1、獲得Class物件,就是獲取到指定的名稱的位

黑馬程式設計師——Java高新技術反射學習總結一

                                                                                    反射學習總結 基礎補充: Java程式中的各個Java類屬於同一類事務,描述這類事務的Java類名就是C

黑馬程式設計師——Java高新技術反射

-------android培訓、java培訓、期待與您交流! ---------- 反射 JAVA反射機制是在執行狀態中,對於任意一個類 (class檔案),都能夠知道這個類的所有屬性和方法; 對於任意一個物件,都能夠呼叫它的任意一個方法和屬性

黑馬程式設計師JAVA高新技術反射

反射 一、反射的基石   反射的基石是Class類。Java程式中的各個java類屬於同一類事物,描述這類事物的java類名就是Class. 1.1 Class類的分析   在程式執行時呼叫類的時候,首先將這個類在硬碟上的二進位制程式碼載入到記憶體中,才可以用這個類建立物件

黑馬程式設計師——Java GUI圖形使用者介面

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ GUI(圖形使用者介面) 一、概述  1.什麼是GUI?   GUI(Graphical User Interface)是使用者與作業系統進行互動的一種

黑馬程式設計師-JAVA高階IO輸入與輸出PART1

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 什麼是IO流? IO流用來處理裝置之間的資料傳輸。Java通過流的方式來操作資料。 流的分類: 按操作

黑馬程式設計師--java高新技術 25--列舉,反射

---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ---------------------- /*1.5 新特性總結: 靜態匯入 可變引數 增強for(foreach) 基本資料的自動拆裝箱 列舉 泛

黑馬程式設計師-JAVA高階網路程式設計PART2

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的知識點主要有: 1.TCP傳輸的幾個應用; 2.瀏覽器訪問伺服器。 一、TCP傳輸的幾個應用

黑馬程式設計師-JAVA高階網路程式設計PART1

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的主要知識點: 1.網路程式設計概述; 2.UDP傳輸; 3.TCP傳輸。 一、網路程式設計概述

黑馬程式設計師-JAVA高階IO輸入與輸出PART4

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分內容的知識點為: 1.IO包中的其他幾個類; 2.字元編碼; 3.練習。 一、IO包中的其他幾個

黑馬程式設計師 Java高新技術--反射和內省

1.框架與框架要解決的核心問題:比如:我做房子賣給使用者住,由使用者自己安裝門窗和空調,我做的房子就是框架,使用者需要使用我的框架,把門窗插入進我提供的框架中。框架和工具類有區別,工具類被使用者的類呼叫,而框架則是呼叫使用者提供的類。2.框架要解決的核心問題:我在寫框架(房子)時,你這個使用者可能還在上小學,

黑馬程式設計師 java高新技術 反射

---------- android培訓、java培訓、期待與您交流! ---------- 一、Class類     Class是Java程式中各個Java類的總稱;它是反射的基石,通過Class類來使用反射。    物件的建立和使用:       建立例項物件:

黑馬程式設計師--java高新技術----反射

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 什麼是反射?         反射就是把一個類中的各種元素對映成一個類。 得到一個類中的元素都是從這個

黑馬程式設計師-JAVA高階IO輸入與輸出PART3

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 這部分的內容主要有以下幾個知識點: 1.File類; 2.Properties類; 3.IO體系的其他一

黑馬程式設計師----Java基礎之反射

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師——集合框架 —— Collection

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">

黑馬程式設計師 Java高新技術---列舉

 ---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 列舉概念: 列舉實際上就是限制了一個類的物件產生範圍。 假如要定義一個Color類,用於上色,而顏

黑馬程式設計師-java基礎加強-反射的深入講解

-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!-------------------------- 透徹分析反射的基礎_Class類 Class類1、定義java程式中的各個java類也屬於同一類事物,而描述這

黑馬程式設計師------java中的反射,beanutils,註解的應用。

Class類:描述眾多java類的物件。代表記憶體裡的一份位元組碼。 有三種方式可以獲取一個類的Class檔案。 方法一:是通過該類物件.getClass()方法。 方法二:通過Class類的靜態方法,Class.forName("name"); 方法三: