新手了解java 反射基礎(chǔ)知識(shí)
一、反射概述
Reflection(反射)是被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何類(lèi)的內(nèi)部信息,并能直接操作任意 對(duì)象的內(nèi)部屬性及方法。 加載完類(lèi)之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個(gè)Class類(lèi)型的對(duì)象 (一個(gè)類(lèi)只有一個(gè)Class對(duì)象),這個(gè)對(duì)象就包含了完整的類(lèi)的結(jié)構(gòu)信 息。我們可以通過(guò)這個(gè)對(duì)象看到類(lèi)的結(jié)構(gòu),這個(gè)對(duì)象就像一面鏡子,透 過(guò)這個(gè)鏡子看到類(lèi)的結(jié)構(gòu),所以我們形象的稱之為反射。
二、常用api
java.lang.Class
:代表一個(gè)類(lèi)
java.lang.reflect.Method
:代表類(lèi)的方法
java.lang.reflect.Field
:代表類(lèi)的成員變量
java.lang.reflect.Constructor
:代表類(lèi)的構(gòu)造器
static Class forName(String name)
返回指定類(lèi)名 name 的 Class 對(duì)象
Object newInstance()
調(diào)用無(wú)參構(gòu)造函數(shù),返回該Class對(duì)象 的一個(gè)實(shí)例
getName()
返回此Class對(duì)象所表示的實(shí)體(類(lèi)、 接口、數(shù)組類(lèi)、基本類(lèi)型或void)名稱
Class getSuperClass()
返回當(dāng)前Class對(duì)象的父類(lèi)的Class對(duì)象
Class [] getInterfaces()
獲取當(dāng)前Class對(duì)象的接口
ClassLoader getClassLoader()
返回該類(lèi)的類(lèi)加載器
Class getSuperclass()
返回表示此Class所表示的實(shí)體的超類(lèi)的Class
Constructor[] getConstructors()
返回一個(gè)包含某些Constructor對(duì)象的數(shù)組
Field[] getDeclaredFields()
返回Field對(duì)象的一個(gè)數(shù)組 Method
getMethod(String name,Class … paramTypes)
返回一個(gè)Method對(duì)象,此對(duì)象的形參類(lèi)型為paramType
示例:
public class Person { private String name; private int age; public Person() { System.out.println("Person類(lèi)被初始化了。。。。。^_^"); } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
反射
public class ClassDemo { public static void main(String[] args) throws Exception { // 1. 創(chuàng)建Class對(duì)象 //Class<Person> clazz = (Class<Person>) Class.forName("Person"); Class<?> clazz =Class.forName("Person"); // 2. 通過(guò)Class對(duì)象調(diào)用其方法 // 2.1. 通過(guò)反射來(lái)實(shí)例化對(duì)象 //Person person = clazz.newInstance(); Object o = clazz.newInstance(); // 此名就相當(dāng)于 Person p = new Person() // 2.2. 獲取類(lèi)的完整類(lèi)名稱(包名+類(lèi)名) String name = clazz.getName(); System.out.println(name); // 2.3. 獲取類(lèi)的簡(jiǎn)單名稱,就是類(lèi)的名稱,不含包名 System.out.println(clazz.getSimpleName()); // 2.4. 獲取構(gòu)造器 Constructor<?>[] constructors = clazz.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor.getName()); } // 2.5. 獲取字段 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field.getName()); } // 2.6. 獲取方法 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } } }
三、創(chuàng)建Class對(duì)象的四種方式
public class Demo { public static void main(String[] args) throws Exception { // 第一種方式:調(diào)用Class.forName() Class clazz =Class.forName("java.lang.String"); // 第二種方式:通過(guò)類(lèi)的字節(jié)碼文件來(lái)創(chuàng)建 Class clazz1 = String.class; // 第三種方式:通過(guò)調(diào)用對(duì)象的getClass()方法來(lái)創(chuàng)建 String str = new String(); Class clazz2 = str.getClass(); // 第四種:通過(guò)類(lèi)裝載器來(lái)創(chuàng)建 ClassLoader loader =String.class.getClassLoader(); Class<?> clazz3 =loader.loadClass("java.lang.String"); } }
總結(jié)
本篇文章就到這里了,希望對(duì)你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot整合freemarker代碼自動(dòng)生成器
最近做了一個(gè)工具,可以實(shí)現(xiàn)代碼自動(dòng)生成,今天整理出來(lái)分享給大家,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列和死信隊(duì)列
RabbitMQ的死信隊(duì)列用于接收其他隊(duì)列中的“死信”消息,所謂“死信”,是指滿足一定條件而無(wú)法被消費(fèi)者正確處理的消息,死信隊(duì)列通常與RabbitMQ的延遲隊(duì)列一起使用,本文給大家介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊(duì)列和死信隊(duì)列,需要的朋友可以參考下2024-06-06關(guān)于MyBatis中SqlSessionFactory和SqlSession簡(jiǎn)解
這篇文章主要介紹了MyBatis中SqlSessionFactory和SqlSession簡(jiǎn)解,具有很好的參考價(jià)值,希望大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12SpringMvc響應(yīng)數(shù)據(jù)及結(jié)果視圖實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringMvc響應(yīng)數(shù)據(jù)及結(jié)果視圖實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Java排序之冒泡排序的實(shí)現(xiàn)與優(yōu)化
冒泡排序是一種簡(jiǎn)單的交換排序。之所以叫做冒泡排序,因?yàn)槲覀兛梢园衙總€(gè)元素當(dāng)成一個(gè)小氣泡,根據(jù)氣泡大小,一步一步移動(dòng)到隊(duì)伍的一端,最后形成一定對(duì)的順序。本文將利用Java實(shí)現(xiàn)冒泡排序,并進(jìn)行一定的優(yōu)化,希望對(duì)大家有所幫助2022-11-11Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)
這篇文章主要介紹了Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn),一棵二叉樹(shù)是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹(shù)和右子樹(shù)的二叉樹(shù)組成,需要的朋友可以參考下2023-11-11