java 反射用法_Java 反射的概念與使用

一,反射的概念

對于一個人來說,了解自己的能力、本事、特點,對于他去干事創業來說,是很重要的。

同樣的,對于一門面向對象的語言來說,了解類(對象其實就是類的實現)本身也是重要的,可以在很多地方幫助程序更好的進行。

那么類/對象本身包含那些內容呢,無非就是類名稱;父類;繼承的接口;類的屬性;類的方法,這些都屬于是類的信息。

好的,那么這些信息程序員都知道啊,類的信息在定義類的時候不是都寫的明明白白的嗎。但是反射的意義卻是:在程序跑起來之后可以使用代碼去獲取類的信息。這個,沒有反射可辦不到。

Java是面向對象的,所有的東西都是有類別的。所以哦,類的信息也是一種類型(就像用戶信息可以用UserInfo類描述),類的信息對應的Java類為Class類,注意不是關鍵字class哈。

舉個最常見的栗子:

public class ClassDemo {

public static void main(String[] args) {

try {

Class mysqlDriver=Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

這里Class.forName很明顯是Class類的一個static方法,這個方法的意思就是按類名(完整的帶包路徑的類名)返回類對應的Class對象。因為forName的參數是可以隨便寫的嘛,所以會拋出一個ClassNotFoundException。

Class.forName方法是在程序運行時按類名稱獲取類的信息的方法,這就是反射機制。

二,如何獲取類的Class對象

我們定義一個普通類Student,可以有三種方式獲取到Student的類型信息:

package temp;

public class Student {

String studentName;

public String getStudentName(){

return studentName;

}

public static void main(String[] args) throws ClassNotFoundException {

//方式1 利用類名稱

Class class1 = Class.forName("temp.Student");

//方式2 利用類

Class class2=Student.class;

//方式3 利用對象

Student student=new Student();

Class class3=student.getClass();

}

}

三,通過類的Class對象獲取類的屬性和方法

獲取到Class(類的類型)之后,再獲取屬性和方法就簡單了,直接使用Class類封裝的方法即可。

getDeclaredFields:獲取類屬性

getDeclaredMethods():獲取類方法

使用一個完整的程序演示如下:

package temp;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Student {

String studentName;

public String getStudentName(){

return studentName;

}

public static void main(String[] args) throws ClassNotFoundException {

Class classStu=Student.class;

Field[] fields = classStu.getDeclaredFields();

for(Field field:fields){

System.out.println("屬性類型:"+field.getType().getSimpleName()+",屬性名稱:"+field.getName());

}

Method[] methods=classStu.getDeclaredMethods();

for(Method method:methods){

System.out.println("方法名稱:"+method.getName()+",返回類型"+method.getReturnType());

}

}

}

執行結果如下:

屬性類型:String,屬性名稱:studentName

方法名稱:main,返回類型void

方法名稱:getStudentName,返回類型class java.lang.String

可見,通過Class類封裝的方法,可以在程序運行時候直接獲取類的信息。

四,反射的意義

凡是都有正反兩個方面,先說不好的消息吧,用了反射,性能肯定是會降低的。注意此處的性能低,并不是說通過反射獲取類的信息性能低,因為除了反射也沒有啥可以獲取類的信息的機制了。

性能低是指通過反射調用方法性能低,看下面的例子,通過反射獲取到方法之后,可以將該方法應用到一個對象上實現該對象的方法調用。本來可以直接調用,反射之后再調用肯定效率要低的。

Class classStu=Student.class;

Student student=new Student();

Method methodGet=classStu.getDeclaredMethod("getStudentName");

//可以通過Method類的invoke方法調用類方法,當然必須得提供對象

String name=(String)methodGet.invoke(student);

System.out.println(name);

但是反射的正面意義還是光輝的,首先提供了一種了解類的信息的手段,使程序運行編寫、運行更加自由靈活,充滿了更多可能性。

簡單的想,在將對象轉換為json時,鍵值對的鍵不就是對象的屬性名稱么,用反射獲取對象的屬性名稱是多么爽快的事情啊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454850.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于Unity中的Mesh Collider碰撞器

原來我的場景中有一個平面Plane帶Mesh Collider碰撞器組件,一個主角Hero帶有一個Box Collider碰撞器和有重力的Rigidbody剛體組件,主角可以放在平面上。 在導入場景后,隱藏平面Plane,給一個地板添加一個Mesh Collider碰撞器&#…

GCC常用選項使用詳解

通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關工具,所以它能把易于人類使用的高級語言編寫的源代碼構建成計算機能夠直接執行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯…

java 井字棋 人機_井字游戲 人機對戰 java實現

package com.ecnu.Main;/*** 主函數觸發游戲*/public class MainApplication {public static void main(String[] args){TicTacToeGame ticTacToeGame new TicTacToeGame();ticTacToeGame.start();}}//TicTacToeGame 方法類import java.util.Scanner;public class TicTacToeGa…

Session(數據)共享的前后端分離Shiro實戰

1,前言本文期望描述如何使用Shiro構建基本的安全登錄和權限驗證。本文實戰場景有如下特殊需求:1,在集群和分布式環境實現session共享;2,前端只使用HTML/CSS/JS。因此無法直接使用Shiro提供的SessionManager&#xff0c…

讀書筆記(javascript 高級程序設計)

一. 數據類型: 1. undefined: 未聲明和未初始化的變量,typeof 操作符返回的結果都是 undefined;(建議未初始化的變量進行顯式賦值,這樣當 typeof 返回 undefined 時就知道是未聲明了,幫助定位問…

關于gcc擴展中的宏定義中用 # 和 ##

關于gcc擴展中的宏定義中用 "#" 和 "##"今天測試了宏定義中的 "#" 和 "##" 的區別。 結果如下: "#" 代表和一個字符串相連接 "##" 代表和一個符號連接,符號可以是變量,或另一…

java 年計算_java實現計算某年某月的天數

在計算某年某月的天數時,需要注意平年閏年。分析:閏年具體的判定方法就要看它的判定條件:四年一閏 , 百年不閏 ,400年再閏。而計算該年該月的天數,又分大月和小月,特殊月份2月之分。(視頻教程推…

添加自定義菜單,報錯40155

2019獨角獸企業重金招聘Python工程師標準>>> 提交的json中,某個自定義菜單對應的URL訪問是有問題的,請挨個檢查一下。 轉載于:https://my.oschina.net/selly1025/blog/1551496

gcc編譯流程及中間表示層RTL的探索

gcc編譯流程及中間表示層RTL的探索收藏新一篇: 解讀VC編程中的文件操作API和CFile類 | 舊一篇: Effective Item21 盡可能使用const 內容摘要 本文將以 C 語言為例,介紹 gcc 在接受一個 .c文件的輸入之后,其前端是如何進行處理并得到一個中間表示并轉交給…

【bzoj2132】圈地計劃 網絡流最小割

題目描述 最近房地產商GDOI(Group of Dumbbells Or Idiots)從NOI(Nuts Old Idiots)手中得到了一塊開發土地。據了解,這塊土地是一塊矩形的區域,可以縱橫劃分為NM塊小區域。GDOI要求將這些區域分為商業區和工業區來開發。根據不同的地形環境,每…

python爬蟲爬取數據如何將br去掉_Python怎么去除爬取下來的網站中的一些轉義字符串 - 收獲啦...

基本方法其實用python爬取網頁很簡單,只有簡單的幾句話這樣就可以獲得到頁面的內容。接下來再用正則匹配去匹配所需要的內容就行了。但是,真正要做起來,就會有各種各樣的細節問題。2.登錄這是一個需要登錄認證的網站。也不太難,只…

Linux基礎

Linux的特點: 系統版本:常見的有debian、Redhat更適合做服務器,更安全和穩定,Ubuntu唯一的優勢就是圖形界面好,centos目前被redhat收購,紅旗已經倒閉。 1、免費的/開源的;2、支持多線程/多用戶&…

GCC的編譯和調試--入門介紹

編譯與調試1.1編譯的概念和理解在進行C程序開發時,編譯就是將編寫的C語言代碼變成可執行程序的過程,這一過程是由編譯器來完成的。編譯器就是完成程序編譯工作的軟件,在進行程序編譯時完成了一系列復雜的過程。1.1.1程序編譯的過程在執行這一…

A* a=new B ,會不會產生內存泄露了,露了B-A的部分?

A* anew B ,delete a;會不會產生內存泄露了,露了B-A的部分。其中B為A的子類 析構函數在下邊3種情況時被調用:1.對象生命周期結束,被銷毀時;2.delete指向對象的指針時,或delete指向對象的基類類型指針,而其基…

spring 第一天:1015

對象加強的三種方法:1/繼承2/裝飾著模式3/動態調用 2:裝飾著模式:就是就是1-先建一個基類 ,如咖啡類 。味道很苦2- 再建一個類配料類 也就是說是所欲配料種類的父類。然后寫多配料子類個子類繼承配料類,。3-子類三個步…

java public 繼承_java繼承問題

代碼:父類:public class Father {public Father() {System.out.println("基類構造函數{");show();new a();System.out.println("}");}public void show() {System.out.println("基類----show");}public class a {public a…

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數(數位DP+惡心細節)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數 Time Limit: 5 Sec Memory Limit: 64 MBDescription 正如你所知,奶牛們沒有手指以至于不能玩“石頭剪刀布”來任意地決定例如誰先擠奶的順序。她們甚至也不能通過仍硬幣的方式。 所以她們通過"round number&q…

Optimizing Code with GCC

現在的編譯器越來越聰明,功能越來越強,從簡單的函數內聯,到復雜的寄存器分析,一系列代碼革命使程序運行得越來越快。大多數時候,更快比更小重要,因為磁盤空間和內存都變得便宜了。但是在嵌入式系統里&#…

QTP的那些事--操作excel的函數

1: QTP Excel函數 操作EXCEL 數據表格 表單 編輯EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生產者消費者模式

經常會有公司叫我們手撕代碼,比如網易,阿里,那我們是不是該掌握下呢。下面這段代碼來自《現代操作系統》進程與線程P49頁。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …