Java反射機制及Method.invoke詳解。本站提示廣大學習愛好者:(Java反射機制及Method.invoke詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java反射機制及Method.invoke詳解正文
JAVA反射機制
JAVA反射機制是在運轉狀況中,關於隨意率性一個類,都可以或許曉得這個類的一切屬性和辦法;關於隨意率性一個對象,都可以或許挪用它的隨意率性一個辦法;這類靜態獲得的信息和靜態挪用對象的辦法的功效稱為java說話的反射機制。
Java反射機制重要供給了以下功效: 在運轉時斷定隨意率性一個對象所屬的類;在運轉時結構隨意率性一個類的對象;在運轉時斷定隨意率性一個類所具有的成員變量和辦法;在運轉時挪用隨意率性一個對象的辦法;生成靜態署理。
1. 獲得某個對象的屬性
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
Class ownerClass = owner.getClass():獲得該對象的Class。
Field field = ownerClass.getField(fieldName):經由過程Class獲得類聲明的屬性。
Object property = field.get(owner):經由過程對象獲得該屬性的實例,假如這個屬性長短私有的,這裡會報IllegalAccessException。
2. 獲得某個類的靜態屬性
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
Class ownerClass = Class.forName(className) :起首獲得這個類的Class。
Field field = ownerClass.getField(fieldName):和下面一樣,經由過程Class獲得類聲明的屬性。
Object property = field.get(ownerClass) :這裡和下面有些分歧,由於該屬性是靜態的,所以直接從類的Class裡取。
3. 履行某對象的辦法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(owner, args);
}
Class owner_class = owner.getClass() :起首照樣必需獲得這個對象的Class。
5~9行:設置裝備擺設參數的Class數組,作為尋覓Method的前提。
Method method = ownerClass.getMethod(methodName, argsClass):經由過程methodName和參數的argsClass(辦法中的參數類型聚集)數組獲得要履行的Method。
method.invoke(owner, args):履行該Method.invoke辦法的參數是履行這個辦法的對象owner,和參數數組args,可以這麼懂得:owner對象中帶有參數args的method辦法。前往值是Object,也既是該辦法的前往值。
4. 履行某個類的靜態辦法
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(null, args);
}
根本的道理和實例3雷同,分歧點是最初一行,invoke的一個參數是null,由於這是靜態辦法,不須要借助實例運轉。
5. 新建實例
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
這裡說的辦法是履行帶參數的結構函數來新建實例的辦法。假如不須要參數,可以直接應用newoneClass.newInstance()來完成。
Class newoneClass = Class.forName(className):第一步,獲得要結構的實例的Class。
第5~第9行:獲得參數的Class數組。
Constructor cons = newoneClass.getConstructor(argsClass):獲得結構子。
cons.newInstance(args):新建實例。
6. 斷定能否為某個類的實例
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
7. 獲得數組中的某個元素
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}