zoukankan      html  css  js  c++  java
  • java的反射

    能够分析类能力的程序称为反射,我们为了在程序运行过程中能够动态的去获得对象域,对象的方法,提出了反射的概念

    一个Class 对象将表示一个特定类的属性,获取这个属性有三种方法

    (1)通过对象.GetClass可以获取这个属性

    (2)或者通过类的名字.class也可以获得这个属性(类要是在包里包的名字也是类名字的一部分)

    (3)Class.forName (className ) 通过类名的字符串来获取

    Class的对象的方法 newlnstance ( ), 可以用来动态地创建一个类的实例,比如e.getClass().newlnstance()就是创建一个和e相同类型的对象

    可以通过下面这个方式来对数组进行扩容

        public static Object goodCopyOf ( Object a , int newLength )
        {
            Class cl = a . getClass();//先获取对象的类型
            if (!cl.isArray()) return null ;//如果不是数组,直接退出
            Class componentType = cl.getComponentType();//获取数组中元素的类型
            int length = Array. getLength(a);//得到数组原来的长度
            Object newArray = Array.newInstance (componentType,newLength);//根据元数类型和数组新长度创建数组
            System . arraycopy (a,0,newArray,0,Math.min(length,newLength));//拷贝
            return newArray ;
        }
    }

    1.通过反射来获取对象中的域值

    AA a = new AA();
    Class cl = AA.getClass();//获取这个类的Class对象
    Filed f = cl.getDeclaredField("name");//获取对象域中叫name的
    Object v = f.get (a) ;//通过get方法传入实际的对象,得到a.name的值

    2.通过反射来调用对象中的方法(类似于函数指针)

    AA tt = new AA();
    Class aa = AA.class;
    int w = 12;
    //其中getMethod中填方法的名字以及对应需要什么类型的参数
    //invoke中填具体那个对象的方法,以及实际传入的参数        aa.getMethod("Myprint",int.class,String.class).invoke(tt,w,"biubiu");
    
    //调用的函数为
        public void Myprint (int aa,String str)
        {
            System.out.println(aa);
            System.out.println(str);
        }

     注:不要过多的使用反射,编译器很难帮助人们发现程序中的错误 , 因此只有在运行时才发现错误并导致异常

  • 相关阅读:
    数据库DQL(Data Query Language)语言学习之一:基础查询
    Mysql查看连接数(连接总数、活跃数、最大并发数)
    完成端口之二:服务器代码
    完成端口之二:线程池部分
    完成端口之一
    日志系统(Log4z源码)
    C++多线程同步之Semaphore(信号量)
    select、poll和epoll的优缺点
    python之切片
    python之Dict和set类型
  • 原文地址:https://www.cnblogs.com/TheQi/p/10443013.html
Copyright © 2011-2022 走看看