【工程截图】
【User.java】
package com.Higgin.reflect; public class User { public User(){ System.out.println("构造方法:User()"); } //方法一: 无返回值,无参 public void userSay(){ System.out.println("hello world!"); } //方法二: String返回值,String参数 public String userSay(String name ){ System.out.println("name: "+name); return name; } //方法三: 无返回值,两个参数 public void userSay(String name,int age){ System.out.println("name: "+name+" age: "+age); } //方法四: Class[]返回值,两个参数 public Class[] userSay(String name,int[] age){ return new Class[]{String.class}; } //方法无: static方法,无返回值,int参数 public static void userSay(int num){ System.out.println("num: "+num); } }
【情况一】
【testUser.java】//反射类的方法 public void userSay()
@Test //反射类的方法 public void userSay() public void test1() throws Exception{ User user=new User(); Class clazz=Class.forName("com.Higgin.reflect.User"); Method method=clazz.getMethod("userSay", null);//"userSay"为反射的方法名称,null代表没有参数 method.invoke(user, null); //null 代表没有参数 }
【运行结果】(注意:打印出“和构造方法:User()”本质原因是代码中的 User user=new User();)
【情况二】
【testUser.java】//反射类的方法 public String userSay(String name)
@Test //反射类的方法 public String userSay(String name) public void test2() throws Exception{ User user=new User(); Class clazz=Class.forName("com.Higgin.reflect.User"); Method method=clazz.getMethod("userSay", String.class); String name=(String) method.invoke(user, "张三"); System.out.println("Get Name:"+name); }
【运行结果】
【情况三】 //反射类的方法 public void userSay(String name,int age)
【testUser.java】
@Test //反射类的方法 public void userSay(String name,int age) public void test3() throws Exception{ User user=new User(); Class clazz=Class.forName("com.Higgin.reflect.User"); //反射类的方法 public void userSay(String name,int age) Method method=clazz.getMethod("userSay", String.class,int.class); //"张三"和18为 userSay的传入参数 method.invoke(user, "张三",18); }
【运行结果】
【情况四】
【testUser.java】//反射类的方法 public Class[] userSay(String name,int[] age)
@Test //反射类的方法 public Class[] userSay(String name,int[] age) public void test4() throws Exception{ User user=new User(); Class clazz=Class.forName("com.Higgin.reflect.User"); Method method=clazz.getMethod("userSay", String.class,int[].class); Class cs[]=(Class[]) method.invoke(user,"李四", new int[]{1,2,3}); System.out.println(cs[0]); }
【运行结果】
【情况五】
【testUser.java】//反射类的方法 public Class[] userSay(String name,int[] age),反射静态方法无需在invoke中传入参数,给null即可
@Test //反射类的方法 public Class[] userSay(String name,int[] age) public void test5() throws Exception{ //User user=new User(); Class clazz=Class.forName("com.Higgin.reflect.User"); Method method=clazz.getMethod("userSay", int.class); method.invoke(null,20); //反射的是静态方法,无需传入对象,不需要user对象 }
【运行结果】(这里可没有构造方法的输出了)