導航:首頁 > 編程語言 > java反射invoke

java反射invoke

發布時間:2022-03-30 00:54:01

java invoke 反射的使用方法

你這個類是一個嚴格的JavaBean格式。。所以先可以獲得屬性。。然後獲得讀寫方法。。然後寫值。。讀值。。hibernate其實也就是採用的這種差不多的方式。。

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TaskProvidePropsList");//這里的類名是全名。。有包的話要加上包名
Object obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
//寫數據
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method wM = pd.getWriteMethod();//獲得寫方法
wM.invoke(obj, 2);//因為知道是int類型的屬性,所以傳個int過去就是了。。實際情況中需要判斷下他的參數類型
}
//讀數據
for(Field f : fields) {
PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
Method rM = pd.getReadMethod();//獲得讀方法
Integer num = (Integer) rM.invoke(obj);//因為知道是int類型的屬性,所以轉換成integer就是了。。也可以不轉換直接列印
System.out.println(num);
}
}

}

⑵ java 中 invoke()的作用是什麼

invoke(調用)就是調用Method類代表的方法。可以實現動態調用,例如可以動態的傳人參數,可以把方法參數化。

可以把方法參數化invoke(class, method),比如Test類里有一系列名字相似的方法setValue1、setValue2等等,可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue。

此外,invoke()對帶有指定參數的指定對象調用,個別參數被自動解包,與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。如下

public Object invoke(Object obj,Object... args)

throws IllegalAccessException,

IllegalArgumentException,

InvocationTargetException

如果底層方法是靜態的,那麼可以忽略指定的obj參數。該參數可以為 null。

如果底層方法所需的形參數為 0,則所提供的args數組長度可以為 0 或 null。

如果底層方法是實例方法,則使用動態方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基於目標對象的運行時類型的重寫時更應該這樣做。

如果底層方法是靜態的,並且尚未初始化聲明此方法的類,則會將其初始化。

如果方法正常完成,則將該方法返回的值返回給調用者;如果該值為基本類型,則首先適當地將其包裝在對象中。但是,如果該值的類型為一組基本類型,則數組元素不被包裝在對象中;換句話說,將返回基本類型的數組。如果底層方法返回類型為 void,則該調用返回 null。

(2)java反射invoke擴展閱讀:

語言特點

1.簡單性

Java看起來設計得很像C++,但是為了使語言小和容易熟悉,設計者們把C++語言中許多可用的特徵去掉了,這些特徵是一般程序員很少使用的。例如,Java不支持go to語句,代之以提供break和continue語句以及異常處理。

2.分布性

Java設計成支持在網路上應用,它是分布式語言。Java既支持各種層次的網路連接,又以Socket類支持可靠的流(stream)網路連接,所以用戶可以產生分布式的客戶機和伺服器。

網路變成軟體應用的分布運載工具。Java程序只要編寫一次,就可到處運行。

3.編譯和解釋性

Java編譯程序生成位元組碼(byte-code),而不是通常的機器碼。Java位元組碼提供對體系結構中性的目標文件格式,代碼設計成可有效地傳送程序到多個平台。Java程序可以在任何實現了Java解釋程序和運行系統(run-time system)的系統上運行。

⑶ java反射機制 如何給不定參數invoke

invoke(Object obj,Object... args)
invoke方法本類就要兩個參數的啊 第一個參數是調用方法的對象 第二個參數本來就是個可變參
直接在後面傳就可以了
BTW:可變參數在Java底層實現的時候就是個數組而已 實在不行你可以提供數組類型的參數來匹配可變參數
invoke(obj,new Object{參數1,參數2,參數3});

如果還不明白那麼qq找我吧:)

⑷ Java反射invoke怎麼用

Java反射中invoke的用法,我給你個例子,你看看吧(每一句都有注釋)

import java.lang.reflect.Method;

import java.lang.reflect.Constructor;

public class S{

public void test(){

System.out.println("test");

}

public static void main(String[] args) throws Exception {

//獲取S類

Class clzz = Class.forName("S");

//獲取S類默認無參構造方法

Constructor con = clzz.getDeclaredConstructor();

//創建一個S類實例對象

S s =(S)con.newInstance();

//獲取S類的公有成員方法test

Method m=clzz.getDeclaredMethod("test");

//調用S類對象s中的公有成員方法test

m.invoke(s);

}

}

⑸ java中反射的三種方法是

第一種:通過forName()方法;

第二種:類.class;

第三種:對象.getClass()。

舉例如下:

package
test;

public class Demo{

public static void
main(){

Class<?> c1 = null;

Class<?> c2 =
null;

Class<?> c3 =
null;

//三種反射用實例化方式

try{

//最常用的一種形式

c1 =
Class.forName("test.X");

}catch(ClassNotFoundException
e){

e.printStackTrace();

}

//通過Object類中的方法實例化

c2
= new X().getClass();

//通過類.class實例化

c3 =
X.class;

System.out.println("類名:" + c1.getName());
//得到類名

System.out.println("類名:" + c2.getName());
//得到類名

System.out.println("類名:" + c3.getName());
//得到類名

}

}

⑹ java反射中method類中的invoke方法是做什麼的,他有什麼作用

首先Method類代表一個方法,所以invoke(調用)就是調用Method類代表的方法。它可以讓你實現動態調用,例如你可以動態的傳人參數。下面是一個簡單的例子。

publicclassMethodTest
{
publicstaticvoidmain(String[]args)
{
String[]names={"tom","tim","allen","alice"};
Class<?>clazz=Test.class;
try
{
Methodmethod=clazz.getMethod("sayHi",String.class);
for(Stringname:names)
method.invoke(clazz.newInstance(),name);
}catch(NoSuchMethodExceptione)
{
e.printStackTrace();
}catch(IllegalAccessExceptione)
{
e.printStackTrace();
}catch(IllegalArgumentExceptione)
{
e.printStackTrace();
}catch(InvocationTargetExceptione)
{
e.printStackTrace();
}catch(InstantiationExceptione)
{
e.printStackTrace();
}
}
}
classTest
{
publicvoidsayHi(Stringname)
{
System.out.println("Hi"+name);
}
}

⑺ 求教Java裡面如何反射invoke父類的overriden方法

import java.lang.reflect.Method;

public class InvokeTest {

public static void main(String[] args) {
Class<?> clazz;
Object obj;
try {
InvokeTest it = new InvokeTest();
clazz = Class.forName("com.test.invoke.User");
obj = clazz.newInstance();

Param p = new Param();
p.setMethodName("introction");
p.setParamTypes(new Class<?>[]{String.class,int.class});
p.setParamValuese(new Object[]{"Tom",20});
Object result = it.call(obj, p);
System.out.println(result+"");

} catch (Exception e) {
e.printStackTrace();
}

}

/**
* 反射方法調用
* @param declareCLass classInstatnce
* @param param 參數設置類
* @return
* @throws Exception
*/
public Object call(Object declareCLass, Param param) throws Exception {
Class<?> clazz = declareCLass.getClass(); //獲取class對象
String name = param.getMethodName(); //從param類中獲取調用方法名
Class<?>[] methodParamTypes = param.getParamTypes(); //從param類中獲取調用方法參數類型
Object[] objs = param.getParamValuese(); //從param類中獲取調用方法參數值
Method method = clazz.getDeclaredMethod(name, methodParamTypes); //通過class對象獲取對應的方法
return method.invoke(declareCLass, objs); //invoke調用方法,傳入 classInstance、 參數值
}

}

/**
* 參數設置類
* @author Administrator
*
*/
class Param {
private String methodName;

private Class<?>[] paramTypes;

private Object[] paramValuese;

public String getMethodName() {
return methodName;
}

public void setMethodName(String methodName) {
this.methodName = methodName;
}

public Class<?>[] getParamTypes() {
return paramTypes;
}

public void setParamTypes(Class<?>[] paramTypes) {
this.paramTypes = paramTypes;
}

public Object[] getParamValuese() {
return paramValuese;
}

public void setParamValuese(Object[] paramValuese) {
this.paramValuese = paramValuese;
}
}

class User {

private String name;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
System.out.println("called method setName value = " + name);
}

public int getAge() {
return age;
}

public void setAge(int age) {
System.out.println("called method setAge value = " + age);
this.age = age;
}

public String introction(String name,int age){
return "My name is "+name+". I'm "+age+" years old.";
}

}

⑻ java中invoke()的作用是什麼

用來執行一個方法,是反射中知識 。

就是調用類中的方法,最簡單的用法是可以把方法參數化invoke(class, method)。

比如你Test類里有一系列名字相似的方法setValue1、setValue2等等。

可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue。

Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。

Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程

⑼ java中的反射,invoke方法詳解

就是調用類中的方法,最簡單的用法是可以把方法參數化,invoke(class, method)比如你Test類里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue

如:publicclass MyTest{publicstaticvoidmain(String[]args) {String[]names={"tom","tim","allen","alice"};

Class<?>clazz=Test.class;try Methodmethod=clazz.getMethod("sayHi",String.class);for(Stringname:names)method.invoke(clazz.newInstance(),name);}catch(NoSuchMethodExceptione)e.printStackTrace();}catch(IllegalAccessExceptie.printStackTrace(}catch(IllegalArgumentException{e.printStackTrace();}catch(InvocationTargetExceptione)e.printStackTrace();}catch(InstantiationExceptione{e.printStackTrace(}classTest{publicvoidsayHi(Stringname){System.out.println("Hi"+name);}

閱讀全文

與java反射invoke相關的資料

熱點內容
移動程序員p7薪資 瀏覽:90
土壤溫濕演算法 瀏覽:585
現在的編譯器都支持c11 瀏覽:937
安卓手機提醒系統更新怎麼辦 瀏覽:790
mastercamkuka機器人離線編程 瀏覽:835
程序員日常生活技巧 瀏覽:740
python如何提取尺寸 瀏覽:753
盧溝橋命令 瀏覽:57
linux將文件移出文件夾命令 瀏覽:137
朗行中控安卓系統怎麼刪除歌曲 瀏覽:713
福昕pdf去除水印 瀏覽:525
為什麼app搜索不到口袋覺醒 瀏覽:915
php光速入門 瀏覽:485
linuxapache不解析php 瀏覽:199
什麼app可以視頻唱歌 瀏覽:406
電子投標加密狗 瀏覽:503
A8平衡車連接什麼APP 瀏覽:573
vc6文件夾怎麼找文件 瀏覽:796
安卓手機怎麼下載不了戰地風雲 瀏覽:966
休息pdf 瀏覽:438