接下來是通過反射獲取類中的方法:
public class ReflectDemo5 {
//獲取class中的方法
publicstatic void main(String[] args) throws Exception {
getMethodDemo_1();
System.out.println("--------------------");
getMethodDemo_2();
System.out.println("--------------------");
getMethodDemo_3();
}
//獲取class中的公共函數
publicstatic void getMethodDemo_1() throws ClassNotFoundException
{
Classclazz=Class.forName("itheima.Person");
//獲取的都是共有方法
Method[]methods=clazz.getMethods();
//只獲取本類中的所有方法,包括私有。
Method[]method=clazz.getDeclaredMethods();
//for循環迭代打印
for(Methodmeth:methods)
{
System.out.println(meth);
}
for(Methodmeth:method)
{
System.out.println(meth);
}
}
publicstatic void getMethodDemo_2() throws Exception{
//獲取類名
Classclazz=Class.forName("itheima.Person");
//獲取空參的show方法
Methodmethod=clazz.getMethod("show", null);
//創建空參實例
Objectobj=clazz.newInstance();
//獲取構造器
Constructorconstructor=clazz.getConstructor(int.class,String.class);;
//設置帶參構造函數
obj=constructor.newInstance(20,"xiaoming");
//invoke的作用是通過函數名反射相應的函數
method.invoke(obj,null);
}
publicstatic void getMethodDemo_3() throws Exception
{
//獲取類名
Classclazz=Class.forName("itheima.Person");
//獲取帶參的paramMethod方法
Methodmethod=clazz.getMethod("paramMethod",String.class,int.class);
//創建一個空參對象
Objectobj=clazz.newInstance();
//獲取構造器
Constructorconstructor=clazz.getConstructor();
//利用構造器創建對象
obj=constructor.newInstance();
//實現動態調用
method.invoke(obj, "minin",30);
}
}
總的來說,反射的功能有如下幾個:
1)可以判斷運行時對象所屬的類
2)可以判斷運行時對象所具有的成員變量和方法
3)通過反射甚至可以調用到private的方法
一般在反射中用到的類有如下幾個:
1)Class:它表示正在運行的Java應用程序中的類和接口
2)Field:提供有關類或接口的屬性信息,以及對它的動態訪問權限
3)Constructor:提供關於類的單個構造方法的信息以及對它的訪問權限
4)Method:提供關於類或接口中某個方法信息。
編寫反射的一般步驟是:
-
必須首先獲取一個類的Class對象
-
分別調用Class對象中的方法來獲取該類的構造函數,成員變量等。
最後列舉一個視頻中的例子來說明反射可以給實際項目開發和維護帶來很大的方便:
假設定義了一個PCI接口;
以及有一個Mainboard(主板)類:
一開始的時候只有主板運行和一個空白的配置文件,其他的功能都沒有,程序如下:
之後要加入NetCard和SoundCard對象但又不想修改原來的程序,這個時候就可以利用反射完成功能的擴展,只需要將擴展功能的類文件寫好再把這些類的類名寫到配置文件中,就可以輕鬆將功能加進去.
寫好的NetCard文件:
寫好的SoundCard文件:
最後將這兩個類文件的完整類名寫到配置文件中即可。
pci1=Myjava.src.xcl.NetCard
pci2=Myjava.src.xcl.SoundCard