JAVA反射案例

通过反射将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

posted on 2019-01-14 11:09  Top丶赵立全  阅读(587)  评论(0编辑  收藏  举报

导航