詳解java中反射機制(含數(shù)組參數(shù))
詳解java中反射機制(含數(shù)組參數(shù))
java的反射是我一直非常喜歡的地方,因為有了這個,可以讓程序的靈活性大大的增加,同時通用性也提高了很多。反射原理什么的,我就不想做過大介紹了,網(wǎng)上一搜,就一大把。(下面我是只附錄介紹下)
Reflection 是Java被視為動態(tài)(或準動態(tài))語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現(xiàn)之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于運行時改變fields內容或喚起methods
在這里,我想說的是如果根據(jù)字符串去做我們自己想要的事(包括動態(tài)執(zhí)行對應的方法,生成相應的類),我們在傳送數(shù)據(jù)的時候,大部分都是傳字符串的(HTTP,socket)等,我們接受到這些字符串時,再根據(jù)這些字符串內容而去做相應的事,那是一件非常不錯的事,可以遠程調用方法(客戶端發(fā)送指定的字符串,讓服務器根據(jù)反射去執(zhí)行對應的方法)。。。事實上,我也曾經做過這樣項目,客戶端(不是java語言寫的)利用socket去呼叫服務器(java寫的)方法,同時還可以直接傳遞參數(shù),這些都是根據(jù)java的反射技術實現(xiàn)的。好了,其他的就多說了,我們從最基礎的看起吧,下面是一個最基本方法反射
/**
* @(#)TestInt.java
*
* @author soda E-mail:sujun10@21cn.com
* @version 1.0
* <br>Copyright (C), 2007 soda.C
* <br>This program is protected by copyright laws.
* <br>Date:2007.4
*/
import java.lang.reflect.Method;
public class TestInt
{
//測試方法
public String test(String name,int i)
{
System.out.println("name:" + name);
System.out.println(i);
return "反射成功!";
}
public static void main(String[] args)
{
try
{
//獲取class文件,可以Class.for("Test")獲取,這樣也可以根據(jù)字符串生成類啦
Class te = TestInt.class;
Class[] cl = new Class[2];
//添加參數(shù)類型
cl[0] = String.class;
cl[1] = int.class;
System.out.println("11111111");
//根據(jù)public的方法,以及參數(shù),參數(shù)是Class[]形式
Method method = te.getMethod("test", cl);
System.out.println("222222222222");
//開始填充參數(shù)
Object[] params = new Object[2];
//params[0] = new String("soda");
params[0] = new String("soda");
params[1] = new Integer(23);
System.out.println("22222222222");
//獲取該class的實例
Object obj = te.newInstance();
//進行方法調用
Object result = method.invoke(obj, params);
System.out.println("結果:" + result);
}
catch (Exception e)
{
System.out.println(e);
}
}
}
編譯執(zhí)行,可以看到想要的結果,想象一下,把那些字符串變成別的地方傳過來的數(shù)據(jù):)
再來一個方法中有數(shù)組的反射,我研究了一下,有一點點的區(qū)別的。大家要仔細看哦
/**
* @(#)Test.java
*
* @author soda E-mail:sujun10@21cn.com
* @version 1.0
* <br>Copyright (C), 2007 soda.C
* <br>This program is protected by copyright laws.
* <br>Program Name:FlashSyncServer
* <br>Date:2007.1
*/
import java.lang.reflect.Method;
//這里我就不做什么解釋了,和前面的幾乎一樣,大家也可以自己去查查api,Class類的api
public class Test
{
public void test(double[] dou)
{
System.out.println(dou.length);
System.out.println(dou[0]);
}
public static void main(String[] args) throws Exception
{
try
{
Class[] cl = new Class[1];
cl[0] = double[].class;
System.out.println("cl[0]:" + cl[0]);
Object[] in = new Object[1];
//注意這里,不是Double[],而是double[]。這里不能用對象數(shù)組
double[] db = new double[1];
db[0] = 100.0;
in[0] = db;
Class te = Test.class;
Method method = te.getMethod("test", cl);
Object obj = te.newInstance();
Object objs = method.invoke(obj, in);
}
catch (Exception e)
{
System.out.println(e);
}
}
}
好了,基本的是這樣了,再復雜的程序也是有基礎演變而來的。我在這里就學會許多:)
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Java利用DelayQueue實現(xiàn)延遲任務代碼實例
這篇文章主要介紹了Java利用DelayQueue實現(xiàn)延遲任務代碼實例,DelayQueue?是一個支持延時獲取元素的阻塞隊列,?內部采用優(yōu)先隊列?PriorityQueue?存儲元素,同時元素必須實現(xiàn)?Delayed?接口,需要的朋友可以參考下2023-12-12
SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,學名是Controller增強器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對于@ControllerAdvice,我們比較熟知的用法是結合@ExceptionHandler用于全局異常的處理,但其作用不止于此2022-08-08
window?下?win10?jdk8安裝與環(huán)境變量的配置過程
這篇文章主要介紹了window?下?win10?jdk8安裝與環(huán)境變量的配置,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08

