Java反射

一. Class类

      类就是对象,类是java.lang.Class类的实例对象
      万事万物皆是对象,
      类也是对象,是Class类的实例对象
      这个对象我们称为该类的类类型
      There is a class named Class
      //第一种表达方式   任何一个类都有一个隐含的静态成员变量Class
      Class c1 = Foo.class

      //第二种表达方式  已经知道该类的对象通过getClass方法
      Class c2 = foo1.getClass();
      
      /*官网 c1,c2表示了Foo类的类类型(class type)*/

      //不管c1 or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
      System.out.println(c1 == c2);

      //第三种表达方式
      Class c3=null;
      c3=Class.forName("com.imooc.reflect.Foo");
      //我们完全可以通过类的类类型创建类的对象实例--->通过c1 or c2 or c3创建Foo的实例对象
      Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法

二. Java动态加载类

  1)  静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
  2)  new创建对象,是静态加载类,在编译时刻就需要加载所有的"可能使用到的类"。有一个类可能有问题(如不存在),都不能通过编译,会报错。    
  3)  Class.forName("类的全称") 通过动态加载类,可以用到一个类时,才进行加载。
     【功能性的类尽量使用动态加载,并对新添加的类实现功能性接口(标准),这样就不用重新编译】
      
        Class c = Class.forName(args[0])  动态加载类
        Office oa = (Office)c.newInstance();
        使用子类实现这个接口,编译时javac office word即可

三. Java获取方法信息

    基本数据类型,void关键字都存在类类型
    class.getMethods()方法获取是该类的所有public方法,包括从父类继承的方法;
    class.getDeclareMethods()方法获取该类自行声明的所有方法,不论访问权限;
    method.getName()获取方法名
    method.getReturnType()获取方法的返回值
    method.getParameterTypes(),获取方法的参数类型的类类型数组class[]
 
    Class c1 = int.class; int的类类型
    Class c2 = String.class; String类的类类型 String类字节码
    Class c3 = double.class; double这个数据类类型的字节码表示方式
    Class c4 = Double.class; Double这个类的类类型字节码表示方式
    Class c5 = void.class; 表达了void这个类的类类型
    getName为这个类的类类型的具体名称 
    c1.getName ---> int
    c2.getName ---> java.lang.String 类的全称
    c2.getSimpleName ---> String 不包含包名的类的名称

四. Java方法反射的基本操作

  1.获取A类中的print(int,int)方法:
     ①要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型
          A a1=new A();  
         Class c= a1.getClass();
     ②获取方法 由名称和参数列表来决定
         getMethod获取的是public方法,                
         getDelcaredMethod获取自己声明的方法
         Method m =c.getMethod(methodName,paramtypes);   //paramtypes可以用数组的形式  表示new Class[]{int.class,int.class},也可以直接列举类类型

     2.方法的反射操作:是用m对象来进行方法调用,和a1.print(10,20)调用的方法相同 m.invoke(a1,new Object[]{10,20})
        Object o=m.invoke(对象名,参数);//方法如果没有返回值返回null,如果有返回值返回具体值,参数可用数组的方式表示,也可以直接列举,没有参数就不写。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 转载请注明出处:https://www.jians...
    ming152阅读 6,989评论 4 78
  • 坐地铁听到一个女的在和人打电话,貌似是推销啥产品,什么这个投资很稳定,和另外一个小组投资不一样,利润我说出来怕吓到...
    鲑鱼sake阅读 423评论 0 0
  • 有没有发现,你走路时, 讨厌车,你开车时 , 讨厌行人,你打工时 , 觉得老板太强势 ,太抠门, 你当老板后 ,又...
    学霸教练李斌阅读 379评论 0 0
  • 姓名:颜学志 公司:上海孚因流体动力设备股份有限公司 【日精进打卡第25天】 【知~学习】 《六项精进》3遍共32...
    一缕白发阅读 417评论 0 50

友情链接更多精彩内容