zoukankan      html  css  js  c++  java
  • JAVA-Reflect(反射)1

    JAVA-Reflect专题(反射)

    ·Class类的使用
    ·方法的反射
    ·成员变量的反射
    ·构造函数的反射
    ·Java类加载机制


    1 Class类的使用
    1)在面向对象的世界里,万物皆对象。
    Java语言中,静态的成员,普通数据类型类是不是对象呢?
    类是谁的对象?
    类是对象,类是java.lang.Class类的实例对象 instance object
    There is a class named Class

    2)这个类怎么表示呢
    comment by me:class ->Foo (class的实例instance)->Foo1 (Foo的实例instance),Class
    class Foo{}
      //Foo的实例对象如何表示
      Foo foo1 = new Foo();//foo1就表示出来了.
      //Foo这个类 也是一个实例对象,Class类的实例对象,如何表示呢
      //任何一个类都是Class的实例对象,这个实例对象有三种表示方式
      
      //第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
      Class c1 = Foo.class;
      
      //第二中表达方式  已经知道该类的对象通过getClass方法
      Class c2 = foo1.getClass();
      
      /*官网 c1 ,c2 表示了Foo类的类类型(class type)
       * 万事万物皆对象,
       * 类也是对象,是Class类的实例对象
       * 这个对象我们称为该类的类类型
       *
       */
      
      //不管c1  or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
      System.out.println(c1 == c2);


    动态加载class:功能性的类尽量使用动态加载(dynamic load),而不是静态加载(static load)。
    Class.forName("类的全称");
    ·a.表示类的class type,b.代表动态加载类
    ·请大家分清编译,运行
    ·编译时刻加载类是静态加载类(new constructor)
     运行时刻加载类是动态加载类
    new 创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用到的类(100个功能,一个加载不成功,程序就编译不通过)
    通过动态加载就可以解决该问题
    try{
    //动态加载类,在运行时刻加载
     Class c =Class.forName("ClassName1")
    //通过class type,创建该类对象
     ClassName1 cn = (ClassName1)c.newInstance();
    }

    4)基本数据类型
     void关键字 都存在class type


    3-1 Java获取方法信息
    5)Class类的基本API操作
     /**
      * 打印类的信息,包括类的成员函数、成员变量(只获取成员函数)
      * @param obj 该对象所属类的信息
      */
     public static void printClassMethodMessage(Object obj){
      //要获取类的信息  首先要获取类的类类型
      Class c = obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型
      //获取类的名称
      System.out.println("类的名称是:"+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.print(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(")");
      }
     }
    /**
         * 获取成员变量的信息
         * @param obj
         */
     public static void printFieldMessage(Object obj) {
      Class c = obj.getClass();
      /*
       * 成员变量也是对象
       * java.lang.reflect.Field
       * Field类封装了关于成员变量的操作
       * getFields()方法获取的是所有的public的成员变量的信息
       * getDeclaredFields获取的是该类自己声明的成员变量的信息
       */
      //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);
      }
     }
     /**
      * 打印对象的构造函数的信息
      * @param obj
      */
     public static void printConMessage(Object obj){
      Class c = obj.getClass();
      /*
       * 构造函数也是对象
       * java.lang. Constructor中封装了构造函数的信息
       * getConstructors获取所有的public的构造函数
       * getDeclaredConstructors得到所有的构造函数
       */
      //Constructor[] cs = c.getConstructors();
      Constructor[] cs = c.getDeclaredConstructors();
      for (Constructor constructor : cs) {
       System.out.print(constructor.getName()+"(");
       //获取构造函数的参数列表--->得到的是参数列表的类类型
       Class[] paramTypes = constructor.getParameterTypes();
       for (Class class1 : paramTypes) {
        System.out.print(class1.getName()+",");
       }
       System.out.println(")");
      }
     }
    }

  • 相关阅读:
    《那些年啊,那些事——一个程序员的奋斗史》——40
    《那些年啊,那些事——一个程序员的奋斗史》——41
    《那些年啊,那些事——一个程序员的奋斗史》——42
    《那些年啊,那些事——一个程序员的奋斗史》——40
    《那些年啊,那些事——一个程序员的奋斗史》——41
    《那些年啊,那些事——一个程序员的奋斗史》——42
    《那些年啊,那些事——一个程序员的奋斗史》——40
    箭牌卫浴(帮朋友发的广告贴)
    Playing with ptrace
    [open source]通过汉字得到拼音的函数库(getpinyin)发布
  • 原文地址:https://www.cnblogs.com/charles999/p/6566664.html
Copyright © 2011-2022 走看看