上一篇經過Class能夠獲取一個類的類模板了而且能夠經過類模板成功的創造出了對象,可是止步於此是沒有意義的由於單純的拿到對象而不去作具體的事對一個對象來講它是很傷心的,下面就看看怎麼能取得method來讓咱們的對象作具體的事。
java
寫一個student類,它有兩個方法 一個是say()方法 一個是run方法spa
public class Student { public String say(String words){ System.out.println("這位同窗說了:"+words); return words; } public void run(int distance){ System.out.println("這位同窗跑了:"+distance+"km"); } }
咱們能夠經過Method這個類來獲取Student中方法的模板
code
public class Test { public static void main(String[] args) { try { Class clazz=Class.forName("com.tl.referce.Student"); System.out.println("method:"); Method methods1[]=clazz.getMethods(); for (Method method : methods1) { System.out.print(method.getName()+"\t"); } System.out.println(); System.out.println("declare methods:"); Method methods2[]=clazz.getDeclaredMethods(); for (Method method : methods2) { System.out.print(method.getName()+"\t"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
輸出結果是:對象
method:繼承
run say wait wait wait equals toString hashCode getClass notify notifyAll get
declare methods:hash
run say it
從輸出結果上能夠看出clazz.getMethods()這個方法他獲取的是該類的全部方法包含了從父類繼承的方法,而clazz.getDeclaredMethods()這個方法只獲取它本身的方法而不包含從父類繼承的方法io
那麼咱們如今獲取到了類的方法的模板,那麼怎麼才能執行該類的方法呢?模板
public class Test { public static void main(String[] args) { try { Class clazz=Class.forName("com.tl.referce.Student"); Method methods1[]=clazz.getMethods(); System.out.println(); Method methods2[]=clazz.getDeclaredMethods(); try { Student student1=(Student) clazz.newInstance(); Method method=clazz.getDeclaredMethod("say", new Class[]{String.class}); method.invoke(student1, "hello world"); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }咱們經過 Method method=clazz.getDeclaredMethod("say", new Class[]{String.class});來獲取clazz中一個名叫say的方法的method模板而後經過method的invoke方法來執行student的say方法,固然還須要傳遞兩個參數,第一個參數說明你須要執行的是那個對象中的方法,第二個參數是爲你要執行的方法傳遞對應的參數。