通过反射将A类中的方法动态输出出来
A类代码:
package reflect; public class A { public void f1() { System.out.println("A's f1()"); } public String f2() { System.out.println("A's f2()"); return "I am f2"; } public void f3(String s1,int a1){ System.out.println("A's f()"); System.out.println("s1:"+s1+",a1:"+a1); } }
反射类的代码:
package reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Scanner; public class TestCase { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Scanner sc = new Scanner(System.in); String ClassName = sc.nextLine(); System.out.println("ClassName:"+ClassName); /* * 加载类: * JAVA虚拟机(JVM)委托类加载器(ClassLoader)查找类的字节码文件,然后将字节码文件的内容读入到方法区 * 然后将这些内容转换成一个对应的class对象。 */ Class clazz = Class.forName(ClassName); //将类实例化 Object obj = clazz.newInstance(); System.out.println("obj"+obj); /* * 得该类的所有方法信息 * Method对象封装了方法的所有信息,比如方法名,参数类型,返回类型等等 */ Method[] methods = clazz.getDeclaredMethods(); for(Method mh:methods){ /* * 获得方法的参数类型信息 * type的长度如果等于0说明该方法不带参 */ Class[] type = mh.getParameterTypes(); //rv是目标方法的返回值 Object rv=null; if(type.length>0){ /* * 该方法带有参数. * params用来存放参数值 */ Object[] params = new Object[type.length]; for(int i=0;i<type.length;i++){ if(type[i]==String.class){ params[i]="hello"; } if(type[i]==int.class){ params[i]=100; } } /* * 调用方法(目标方法带有参数) */ rv = mh.invoke(obj, params); }else{ /* * 调用方法 * rv是目标方法的返回值 */ rv = mh.invoke(obj); } System.out.println("rv"+rv); } } }
reflect.A
输出结果为:
ClassName:reflect.A
objreflect.A@4aa298b7
A's f()
s1:hello,a1:100
rvnull
A's f1()
rvnull
A's f2()
rvI am f2