java反射的用途及实现
生活随笔
收集整理的這篇文章主要介紹了
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的“類對象”,然后通過類對象獲取“構造器對象”再通過構造器對象創建一個對象。
給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.獲取成員變量并使用
步驟;
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反射的用途及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021中国集成电路行业投资市场研究报告
- 下一篇: 洞察SaaS:中国SaaS的前世今生