反射

作者: 我该忘了我自己w_u | 来源:发表于2016-09-27 14:26 被阅读40次

    Class 类 基础
    万事万物皆对象,基本类型(包箱)之后是对象(如:Double 是对象,double 是基本类型)

        Food foo1 = new Foo();//foo1表示出来了
          //Foo这个类 也是一个实例对象,Class类的实例对象,
          //第一种表示方式  -->实际在告诉我们任何一个类都有一个隐含的静态成员变量class 
         Class c1 =Foo.class;
          //第二种表达方式,已经该类的对象 加 getClass方法
         Class c2 = foo1.getClass();
          //c1,c2表示了Foo类的类类型
        //第三种方式  
          Class c3 = null ;
         c3 =Class.forName(com.zuojia.ai");
    

    动态加载类
    编译 静态加载 运行 动态加载

    反射 获取方法名

       public static void  printClassMessage(Object obj){
          //obj 携带了类信息
          //要获取类的信息  首先 获取类的类类型
          Class c = obj.getClass();
          //传递的是哪个子类的对象 c就是该子类的类类型
          //获取类的名称
          System.out.print("类的名称是: "+ c.getName());
              /** * Method 类,方法对象 * 一个成员方法就是一个Method对象 *
               getMethods()方法获取的是所有的public的函数,包括父类继承而来的 *
               getDeclaredMethods()获取的是所有该类自己声明的方法, */
         Method[]ms = c.getMethods(); 
             //c.getDeclaredMethods();
          for (int i = 0;i<ms.length; i++){    
                  //得到方法的返回值类型的类类型   
              Class returnType = ms[i].getReturnType();
              System.out.println("返回值类类型"+returnType.getName()+" "); 
                  //得到方法名称 
             System.out.print("得到的方法名 "+ms[i].getName()+"(");
              //获取参数类型 -->得到的是参数列表的类型的类类型  
        Class[]paramTypes = ms[i].getParameterTypes();  
          for (Class class1 : paramTypes){     
             System.out.print(class1.getName()+" , "); 
           }  
        System.out.println(")");  
    }
    

    反射 获取属性 成员变量

            /** * 成员变量也是对象 * java.lang.reflect.
                 Field * Feild 类封装了关于成员变量的操作 *
                 getFields()方法获取的是所有的
                 public 的成员变量的信息 *
                 getDeclaredFields获取的是该类自己声明的成员变量的信息 * */
    
    public static void  printClassMessage(Object obj){
             Class c = obj.getClass();
    
          //            Field[] fs = c.getFields();  
              Field[] fs = c.getDeclaredFields();
        //            遍历       
             for (Field field :fs){     
                   //得到成员变量的类型的类类型  
                     Class fieldType  =field.getType();         
                     String typeName = fieldType.getName();    
                    //得到成员变量的名称             
                     String fieldName = field.getName();     
                     System.out.println("成员变量类类型"+typeName+"  成员变量名称"+fieldName);       
             }
    }
    

    反射 获取构造函数

    public static void  printClassMessage(Object obj){
            Constructor [] con  = c.getConstructors();
              //获得共有的构造方法    
            Constructor [] cons = c.getDeclaredConstructors();
              //自己声明的 
           for (Constructor constructor:con){   
                   System.out.println("构造函数名 "+constructor.getName() +"(");    
                      //获取构造函数的参数列表-->得到的是参数列表的类类型    
                   Class[] paramTypess = constructor.getParameterTypes(); 
                   for (Class cla :paramTypess ){ 
                           System.out.println(" 参数名 "+cla.getName());
                       }    
                  }
            }
    

    反射 方法

          ArrayList list1 = new ArrayList(); 
          ArrayList<String>list = new ArrayList<String>();  
          list.add("hey ,zj ");        //list 只能加字符串     
         System.out.println(list.getClass() == list1.getClass());    
        //输出为ture  说明 变异后 没有范性 范性是提醒 开发人员类型不一致用哒 
         Class c1=list.getClass();      
        try {           
               Method method = c1.getMethod("add", Object.class);   
               method.invoke(list, 100);          
               method.invoke(list, 102);        
                  //绕过编译 可以加 int      
              System.out.println("size:"+list.size());     
                  //所以就不能 遍历 因为 内容不是string类型
                //            for (String string:list){
                    //                System.out.println(string);
              //            }      
            }catch (Exception e)

    相关文章

      网友评论

      • MarcoHorse:其实这样只能说是反射的基本写法,楼主可以看下Class类,更深一点了解反射机制!一起努力吧
        我该忘了我自己w_u:@MarcoHorse 谢谢同学指导

      本文标题:反射

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