zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTML5课程
    css3兼容代码
    动画
    css3学习笔记(一)
    3d旋转
    Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……
    AngularJs1.X学习--路由
    Angular学习笔记 ——input 标签上的【name属性】和【ngModelOptions属性】
    Angular学习笔记【ngx-bootstrap】中的 tabset
    TFS 签入时,提示“变更集注释策略 中的内部错误……”
  • 原文地址:https://www.cnblogs.com/topzhao/p/10265793.html
Copyright © 2011-2022 走看看