Java反射

2018-09-03  本文已影响0人  Gandalf_108

一. 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,如果有返回值返回具体值,参数可用数组的方式表示,也可以直接列举,没有参数就不写。
上一篇下一篇

猜你喜欢

热点阅读