Java方法的反射(对反射的进一步认识)
生活随笔
收集整理的這篇文章主要介紹了
Java方法的反射(对反射的进一步认识)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
理論
實例
?
理論
這是學Java反射的第三天了,今天對Java反射有了新的認識,個人覺得,Java的反射,實際上是存在一個對象的副本。這個對象的副本實際上是一個Class指針(Java里面沒有指針的概念,這里為了理解,特意搬出來的),然而這個Class指針估計是保存在Java虛擬機里面的,都會存在對象的類類型的指針到Java虛擬機里面,因為在Java中,處處都是對象,連函數也是對象。所以可以直接調用函數方法。
?
方法的反射
如何獲取某個方法:方法的名稱和方法的參數列表才能唯一決定某個方法。
【注意,Java不是C++,函數的返回值不同的話,也是相同的函數】
方法反射的操作:method.invoke(對象, 參數列表)
?
?
實例
程序結構如下:
運行截圖如下:
源碼如下!
MethodDemo.java
package my;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;public class MethodDemo {public static void main(String[] args) {/*** 獲取類的方法,首先要獲取類的類型*/Test a1 = new Test();Class c = a1.getClass();/*** 獲取方法 名稱和參數列表來決定* getMethod獲取的是public方法* getDelcaredMethod是自己聲明的方法*/try {Method m = c.getMethod("print", new Class[] {int.class, int.class});//Method m = c.getMethod("print", int.class, int.class);/*** 使用invoke進行反射的調用*/try {Object o = m.invoke(a1, new Object[] {10, 20});//方式二o = m.invoke(a1, 20, 30);System.out.println("----------華麗的分割線----------");Method mStr = c.getMethod("print", new Class[] {String.class, String.class});o = mStr.invoke(a1, new String[]{"how", "are"});System.out.println("----------華麗的分割線----------");Method mNull = c.getMethod("print");mNull.invoke(a1);}catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }class Test{public void print() {System.out.println("helloWorld");}public void print(int a, int b) {System.out.println(a + b);}public void print(String a, String b) {System.out.println(a.toUpperCase() + "," + b.toUpperCase());}}?
總結
以上是生活随笔為你收集整理的Java方法的反射(对反射的进一步认识)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-FileDialog
- 下一篇: C++设计模式-模板方法模式