美文网首页
Java反射

Java反射

作者: Gandalf_108 | 来源:发表于2018-09-03 20:31 被阅读0次

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

    相关文章

      网友评论

          本文标题:Java反射

          本文链接:https://www.haomeiwen.com/subject/zmbiwftx.html