java反射 通用的java反射工具

2021-08-28 04:30:23 字數 1753 閱讀 4295

因專案需要,需要反射呼叫安卓系統audiomanager的一些方法,這些方法或者使用@hide標記,或者需要的sdk版本比較高,無法直接呼叫,這個時候,反射就是一大神器了。

正常的反射呼叫流程如下:

//非靜態有返回值方法反射

class clazz = class.forname("full classname");

target newinstance = clazz.newinstance();

method method = clazz.getdeclaredmethod("methodname",classes(variable arguments type));

method.setaccessible(true); // for private method

object obj = method.invoke(newinstance,objects(variable arguments));

//靜態無返回值方法反射

class clazz = class.forname("full classname");

method method = clazz.getdeclaredmethod("methodname",classes(variable arguments type));

method.setaccessible(true); // for private method

method.invoke(null,objects(variable arguments));

上面是非靜態有返回值的方法反射呼叫流程和靜態無返回值方法的呼叫,其他不逐一而論。

下面來看一下我們的預期目標:

反射類:target.class

全類名:***.***.target

方法名:public int set(int arg1,string arg2)

return ret;

}這樣就能以相對簡潔的形式進行反射方法的呼叫。下面講一下reflectmethod(string targetmethodname,object ...objects)方法的實現。

private object reflectmethod(string methodname,object ...objects)

}try catch (nosuchmethodexception e) catch (invocationtargetexception e) catch (illegalacces***ception e)

return obj;

}private class getprimitivetype(object obj)

} catch (nosuchfieldexception e) catch (illegalacces***ception e)

log.d(tag, "getprimitivetype 2" + type);

return clazz;

}

大體上好理解,就是通過傳入引數的獲取其型別,供反射使用,但是傳入引數為八種基礎型別時,getclass()獲得的是其對應的包裝型別,即反射需要的是 int.class ,而我們通過object.getclass()獲得的是integer.class,integer類中有乙個靜態變數type指向的就是int.class,即 int.class == integer.type,其他的八種基礎型別都有定義這樣的type變數,指向自己的基礎型別。

上面就是整個實現過程,當然還有考慮不足之處,可以根據自己的需要完善,請多指正!

java反射 4 反射賦值

本篇介紹利用反射給物件賦值 方法1 獲得並使用預設構造器建立類的物件 並對物件賦值 這裡類用的是person類 屬性有 id name address 來做例子 public class person public void setid integer id public string getnam...

Java反射例子

一 學生類 package com.enorth.bean title 學生 description 學生元件 company 秦金雷 version 1.0 public class student public void setstudentid int studentid public str...

java反射效率

測試背景 1.測試簡單bean int,integer,string 的set方法 2.loop 1億次 3.測試 盡可能避免物件的建立,方法的呼叫,僅僅測試set方法的耗時 測試結果 場景 本機測試結果 xp,雙核,2g 伺服器測試結果 linux,xen虛擬機器,8核,5.5g 方法直接呼叫 2...