日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java反射的用途及实现

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反射的用途及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Java反射框架主要提供以下功能

  • 1.在運行時判斷任意一個對象所屬的類;
  • 2.在運行時構造任意一個類的對象;
  • 3.在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調用private方法);
  • 4.在運行時調用任意一個對象的方法

二、主要用途

反射最重要的用途就是開發各種通用框架(Spring,hibernate,mybatis)。

三、基本反射功能的實現(反射相關的類一般都在java.lang.relfect包里)

  • 1、獲得Class對象
  • 2、判斷是否為某個類的實例
  • 3、創建實例
  • 4、獲取方法
  • 5、獲取構造器信息
  • 6、獲取類的成員變量(字段)信息
  • 7、調用方法
  • 8、利用反射創建數組

通過轉載大佬的實例幫助了解:

四、類例

1.hero類

package pojo; public class Hero {public String name; //姓名public float hp; //血量public float armor; //護甲public int moveSpeed; //移動速度 }

獲取類對象有3種方式

1.Class.forName() 2.Hero.class 3.new Hero().getClass()

在一個JVM中,一種類,只會有一個類對象存在(此處準確是在ClassLoader下,只有一個類對象)。所以以上三種方式取出來的類對象,都是一樣。
2 .用反射機制創建對象
步驟:與傳統的通過new 來獲取對象的方式不同反射機制,反射會先拿到Hero的“類對象”,然后通過類對象獲取“構造器對象”再通過構造器對象創建一個對象。

1.獲取類對象 Class class = Class.forName("pojo.Hero"); 2.獲取構造器對象 Constructor con = clazz.getConstructor(形參.class); 3 獲取對象 Hero hero =con.newInstance(實參) //這是最簡單的獲取方法,當Hero的構造方法不是無參構造方法時,獲取構造器對象略有不同

給Hero類添加構造方法:

//(默認的構造方法)Hero(String str){System.out.println("(默認)的構造方法 s = " + str);//無參構造方法public Hero(){System.out.println("調用了公有、無參構造方法執行了。。。");}//有一個參數的構造方法public Hero(char name){System.out.println("姓名:" + name);}//有多個參數的構造方法public Hero(String name ,float hp){System.out.println("姓名:"+name+"血量:"+ hp);}//受保護的構造方法protected Hero(boolean n){System.out.println("受保護的構造方法 n = " + n);}//私有構造方法private Hero(float hp){System.out.println("私有的構造方法 血量:"+ hp);}

3.通過反射機制獲取對象:

package test; public class ConstructorTest {/** 通過Class對象可以獲取某個類中的:構造方法、成員變量、成員方法;并訪問成員;* 1.獲取構造方法:* 1).批量的方法:* public Constructor[] getConstructors():所有"公有的"構造方法public Constructor[] getDeclaredConstructors():獲取所有的構造方法(包括私有、受保護、默認、公有)* 2).獲取單個的方法,并調用:* public Constructor getConstructor(Class... parameterTypes):獲取單個的"公有的"構造方法:* public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個構造方法"可以是私有的,或受保護、默認、公有;* 2.創建對象* Constructor對象調用newInstance(Object... initargs)*/public static void main(String[] args) throws Exception {//1.加載Class對象Class clazz = Class.forName("pojo.Hero");//2.獲取所有公有構造方法System.out.println("**********************所有公有構造方法*********************************");Constructor[] conArray = clazz.getConstructors();for(Constructor c : conArray){System.out.println(c);}System.out.println("************所有的構造方法(包括:私有、受保護、默認、公有)***************");conArray = clazz.getDeclaredConstructors();for(Constructor c : conArray){System.out.println(c);}System.out.println("*****************獲取公有、無參的構造方法*******************************");Constructor con = clazz.getConstructor(null);//1>、因為是無參的構造方法所以類型是一個null,不寫也可以:這里需要的是一個參數的類型,切記是類型//2>、返回的是描述這個無參構造函數的類對象。System.out.println("con = " + con);//調用構造方法Object obj = con.newInstance();System.out.println("******************獲取私有構造方法,并調用*******************************");con = clazz.getDeclaredConstructor(float.class);System.out.println(con);//調用構造方法con.setAccessible(true);//暴力訪問(忽略掉訪問修飾符)obj = con.newInstance(100);} }//總結獲取構造器對象方法:1).批量的方法: public Constructor[] getConstructors():所有"公有的"構造方法 public Constructor[] getDeclaredConstructors():獲取所有的構造方法(包括私有、受保護、默認、公有)2).獲取單個的方法: public Constructor getConstructor(Class… parameterTypes): 獲取單個的"公有的"構造方法 public Constructor getDeclaredConstructor(Class…parameterTypes):獲取"某個構造方法"可以是私有的,或受保護、默認、公有;

4.獲取成員變量并使用
步驟;

1. 獲取Hero類的對象 2. 獲取屬性 Field f1 = h.getDeclaredField("屬性名") 3. 修改屬性 f1.set(hero,實參),注意這里的hero是對象,不是類對象 Hero hero=new Hero();hero.setName("hero1");try {//獲取類HeroPlus的名字叫做name的字段System.out.println("修改前的name:"+hero.name);Field f1= hero.getClass().getDeclaredField("name");//修改這個字段的值f1.set(hero, "hero2");//打印被修改后的值System.out.println("修改后的name:"+hero.name);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} //修改前的name:hero1 //修改后的name:hero2 //補充:getField和getDeclaredField的區別 //getField只能獲取public的,包括從父類繼承來的字段。 //getDeclaredField 可以獲取本類所有的字段,包括private的,但是不能獲取繼承來的字段。 (注:這里只能獲取到private的字段,但并不能訪問該private字段的值,除非加上setAccessible(true))

5.獲取成員方法并使用

1.獲取Hero類的對象 2.獲取成員方法: public Method getMethod(String name ,Class<?>… parameterTypes): 獲取"公有方法";(包含了父類的方法也包含Object類) public Method getDeclaredMethods(String name ,Class<?>… parameterTypes) : 獲取成員方法,包括私有的(不包括繼承的) 3.參數解釋:name : 方法名;Class: 形參的Class類型對象 4.調用方法(invoke) Method --> public Object invoke(Object obj,Object… args): 5.參數說明:obj : 要調用方法的對象;args:調用方式時所傳遞的實參; Hero hero = new Hero("hero1");try {// 獲取這個名字叫做setName,參數類型是String的方法Method m = hero.getClass().getMethod("setName", String.class);System.out.println("修改前"+hero.getName());// 對hero對象,調用這個方法m.invoke(hero, "hero2");// 使用傳統的方式,調用getName方法System.out.println("修改后"+hero.getName());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} //修改前hero1 //修改后hero2

五、Class類方法總結

六、關于反射的用法舉例

反射非常強大,但是從上面的記錄來看,反而覺得還不如直接調用方法來的直接和方便。
通常來說,需要在學習了Spring 的依賴注入,反轉控制之后,才會對反射有更好的理解。

本文參考

總結

以上是生活随笔為你收集整理的java反射的用途及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。