A. java 反射機制的幾個調用方法
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
* Created by IntelliJ IDEA.
* File: TestRef.java
* User: leimin
* Date: 2008-1-28 14:48:44
*/
public class TestRef {
public staticvoid main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("這個一個Foo對象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新設置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("這是測試反射的測試類");
}
}
B. java 反射 方法調用
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於專任意一個對屬象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
JAVA反射(放射)機制:「程序運行時,允許改變程序結構或變數類型,這種語言稱為動態語言」。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。但是JAVA有著一個非常突出的動態相關機制:Reflection,用在Java身上指的是我們可以於運行時載入、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以載入一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。
說白了就是調用這個累的.Class方法然後調用其屬性和方法。
C. 如何通過java 反射 調用一個 含有 可變參數的 方法呢
java反射調用可變參數的方法的方式是傳入objects參數,如下代碼:
publicclassReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Single.class;
Singlesingle=(Single)clazz.newInstance();
List<String>list=newArrayList<String>(){
=1L;
{
add("fuck");
add("ni");
add("mei");
}
};
//獲取method兩種方式,在method中數組的的空間大小是可以隨便寫的不一定使用0
/*1*/
Methodmethod=clazz.getDeclaredMethod("method",Array.newInstance(Object.class,0).getClass());
/*2*/
method=clazz.getDeclaredMethod("method",(newObject[0]).getClass());//初始化參數
/*1*/
Objectobjs=Array.newInstance(Object.class,2);
Array.set(objs,0,list);
Array.set(objs,1,"23");
method.invoke(single,objs);
/*2*/
Object[]objects={1,"fuck",list};
method.invoke(single,newObject[]{objects});
}
}
classSingle{
publicvoidmethod(Object...objs){
System.out.println(Arrays.deepToString(objs));
}
}
結果:
[[fuck,ni,mei],23]
[1,fuck,[fuck,ni,mei]]
D. Java如何接收使用反射執行方法所返回的值
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Method;
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsException{
//獲取位元組碼文件對象
Classc=Class.forName("cn.itcast_01.Person");
//獲取所有的方法
//Method[]methods=c.getMethods();//獲取自己的包括父親的公共方法
//Method[]methods=c.getDeclaredMethods();//獲取自己的所有的方法
//for(Methodmethod:methods){
//System.out.println(method);
//}
Constructorcon=c.getConstructor();
Objectobj=con.newInstance();
/*
*Personp=newPerson();p.show();
*/
//獲取單個方法並使用
//publicvoidshow()
//publicMethodgetMethod(Stringname,Class<?>...parameterTypes)
//第一個參數表示的方法名,第二個參數表示的是方法的參數的class類型
Methodm1=c.getMethod("show");
//obj.m1();//錯誤
//publicObjectinvoke(Objectobj,Object...args)
//返回值是Object接收,第一個參數表示對象是誰,第二參數表示調用該方法的實際參數
m1.invoke(obj);//調用obj對象的m1方法
System.out.println("----------");
//publicvoidmethod(Strings)
Methodm2=c.getMethod("method",String.class);
m2.invoke(obj,"hello");
System.out.println("----------");
//publicStringgetString(Strings,inti)
Methodm3=c.getMethod("getString",String.class,int.class);
ObjectobjString=m3.invoke(obj,"hello",100);
System.out.println(objString);
//Strings=(String)m3.invoke(obj,"hello",100);
//System.out.println(s);
System.out.println("----------");
//privatevoidfunction()
Methodm4=c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);
}
}
E. java 反射 調用無參數方法
通過Java反射調用無參數方法,這是個測試用的例子,通過反射調用對象的方法,代碼如下:
importjava.lang.reflect.Method;
importjava.lang.reflect.InvocationTargetException;
/**
*CreatedbyIntelliJIDEA.
*File:TestRef.java
*User:Administrator
*Date:2015-7-1016:28:44
*/
publicclassTestRef{
publicstaticvoidmain(Stringargs[])throwsNoSuchMethodException,IllegalAccessException,InvocationTargetException{
Foofoo=newFoo("這個一個Foo對象!");
Classclazz=foo.getClass();
Methodm1=clazz.getDeclaredMethod("outInfo");
Methodm2=clazz.getDeclaredMethod("setMsg",String.class);
Methodm3=clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo,"重新設置msg信息!");
Stringmsg=(String)m3.invoke(foo);
System.out.println(msg);
}
}
classFoo{
privateStringmsg;
publicFoo(Stringmsg){
this.msg=msg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidoutInfo(){
System.out.println("這是測試Java反射調用無參數方法的測試類");
}
}
控制台輸出結果:
這是測試Java反射調用無參數方法的測試類
重新設置msg信息!
Processfinishedwithexitcode0
F. java反射中method類中的invoke方法是做什麼的
就是調用類中的復方法,最制簡單的用法是可以把方法參數化
invoke(class, method)
比如你Test類里有一系列名字相似的方法setValue1、setValue2等等
可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue