• JAVA反射


    Class

    在面向对象的世界里,万事万物皆对象

    类是对象,类是java.lang.Class类的实例对象,每一个对象所属的类就是java.lang.Class类的实例。

    下面一个事例:

    public class ClassDemo1 {

        public static void main(String[] args) {

        //Foo的实例对象如何表示

           Foo foo1=new Foo();

        //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 c3=null;

        try {

           c3=Class.forName("com.imooc.reflect.Foo");

        } catch (ClassNotFoundException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

        System.out.println(c2==c3);

        //我们可以通过类的类类型创建该类的对象实例--->通过c1,c2,c3创建Foo的实例对象

        try {

           Foo foo=(Foo)c1.newInstance();//需要有无参数的构造方法

           foo.print();

        } catch (InstantiationException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        } catch (IllegalAccessException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

    }

    }

    class Foo{

        void print(){

           System.out.println("foo");

        }

    }

    打印结果:

    true

    true

    foo

    Class.forName(“类的全称”)

    不仅表示了类的类类型,还表示了动态加载类

    要区分编译和运行

    编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

    New创建对象是静态加载类,在类的编译时刻就需要加载所有可能使用到的类,通过动态加载类可以解决该问题(Class.forName(“类的全称”))

    获取方法信息

    public class ClassDemo2 {

     

          public static void main(String[] args) {

              

               Class c1=int.class;//int的类类型

               Class c2=String.class;//String的类类型

               Class c3=double.class;

               Class c4=Double.class;

               Class c5=void.class;

              

               System.out.println(c1.getName());

               System.out.println(c2.getName());

               System.out.println(c2.getSimpleName());//不包含包名的类名称

               System.out.println(c3.getName());

               System.out.println(c4.getName());

               System.out.println(c5.getName());

          }

    }

    打印结果:

    int

    java.lang.String

    String

    double

    java.lang.Double

    void

    基本数据类型

    void关机键字都存在类类型

    Class类的基本API操作

    查看类的成员函数

    public class ClassUtil {

       /**

        * 打印类的信息,包括类的成员函数,成员变量

        * @param obj该对象所属类的信息

        */

          public static void printClassMessage(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++) {

                     //得到方法的返回值类型的类类型,如果方法返回时String或者int类型,那么得到的就是String.class或int.class

                     Class returnType=ms[i].getReturnType();

                     System.out.print(returnType.getName()+" ");

                     //得到方法名称

                     System.out.print(ms[i].getName()+"(");

                     //获取参数类型--->得到的是参数列表的类型的类类型

                     Class[] paramTypes=ms[i].getParameterTypes();

                     for (int j=0;j<paramTypes.length;j++) {

                          System.out.print(paramTypes[j].getName()+",");

                     }

                     System.out.println(")");

               }

          }

    public static void main(String[] args) {

               String s="hello";

               ClassUtil.printClassMessage(s);

          }

    }

    打印结果:

    类的名称:java.lang.String

    boolean equals(java.lang.Object,)

    java.lang.String toString()

    int hashCode()

    int compareTo(java.lang.String,)

    int compareTo(java.lang.Object,)

    int indexOf(java.lang.String,int,)

    int indexOf(java.lang.String,)

    int indexOf(int,int,)

    int indexOf(int,)

    java.lang.String valueOf(int,)

    java.lang.String valueOf(long,)

    java.lang.String valueOf(float,)

    java.lang.String valueOf(boolean,)

    java.lang.String valueOf([C,)

    java.lang.String valueOf([C,int,int,)

    java.lang.String valueOf(java.lang.Object,)

    java.lang.String valueOf(char,)

    java.lang.String valueOf(double,)

    char charAt(int,)

    int codePointAt(int,)

    int codePointBefore(int,)

    int codePointCount(int,int,)

    int compareToIgnoreCase(java.lang.String,)

    java.lang.String concat(java.lang.String,)

    boolean contains(java.lang.CharSequence,)

    boolean contentEquals(java.lang.CharSequence,)

    boolean contentEquals(java.lang.StringBuffer,)

    java.lang.String copyValueOf([C,)

    java.lang.String copyValueOf([C,int,int,)

    boolean endsWith(java.lang.String,)

    boolean equalsIgnoreCase(java.lang.String,)

    java.lang.String format(java.util.Locale,java.lang.String,[Ljava.lang.Object;,)

    java.lang.String format(java.lang.String,[Ljava.lang.Object;,)

    void getBytes(int,int,[B,int,)

    [B getBytes(java.nio.charset.Charset,)

    [B getBytes(java.lang.String,)

    [B getBytes()

    void getChars(int,int,[C,int,)

    java.lang.String intern()

    boolean isEmpty()

    java.lang.String join(java.lang.CharSequence,[Ljava.lang.CharSequence;,)

    java.lang.String join(java.lang.CharSequence,java.lang.Iterable,)

    int lastIndexOf(int,)

    int lastIndexOf(java.lang.String,)

    int lastIndexOf(java.lang.String,int,)

    int lastIndexOf(int,int,)

    int length()

    boolean matches(java.lang.String,)

    int offsetByCodePoints(int,int,)

    boolean regionMatches(int,java.lang.String,int,int,)

    boolean regionMatches(boolean,int,java.lang.String,int,int,)

    java.lang.String replace(char,char,)

    java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence,)

    java.lang.String replaceAll(java.lang.String,java.lang.String,)

    java.lang.String replaceFirst(java.lang.String,java.lang.String,)

    [Ljava.lang.String; split(java.lang.String,)

    [Ljava.lang.String; split(java.lang.String,int,)

    boolean startsWith(java.lang.String,int,)

    boolean startsWith(java.lang.String,)

    java.lang.CharSequence subSequence(int,int,)

    java.lang.String substring(int,)

    java.lang.String substring(int,int,)

    [C toCharArray()

    java.lang.String toLowerCase(java.util.Locale,)

    java.lang.String toLowerCase()

    java.lang.String toUpperCase()

    java.lang.String toUpperCase(java.util.Locale,)

    java.lang.String trim()

    void wait()

    void wait(long,int,)

    void wait(long,)

    java.lang.Class getClass()

    void notify()

    void notifyAll()

    java.util.stream.IntStream chars()

    java.util.stream.IntStream codePoints()

    查看类的成员变量

    public class ClassUtil {

       /**

        * 打印类的信息,包括类的成员变量

        * @param obj该对象所属类的信息

        */

    public static void printFieldMessage(Object obj) {

          Class c=obj.getClass();

          /**

           * 成员变量也是对象,java.lang.reflect.Field类封装了关于成员变量的操作

           * getFields()方法获取的是所有的public的成员变量的信息

           * getDeclaredFields()获得自己所有声明的成员变量的信息

           */

          //Field[] fs=c.getFields();

          Field[] fs=c.getDeclaredFields();

          for(int k=0;k<fs.length;k++){

               //得到成员变量的类类型

               Class fieldType=fs[k].getType();

               String typeName=fieldType.getName();

               //得到成员变量的名称

               String fieldName=fs[k].getName();

               System.out.println(typeName+" "+fieldName);

          }

    }

    public static void main(String[] args) {

               String s="hello";

               ClassUtil.printFieldMessage(s);

          }

    }

    打印结果:

    [C value

    int hash

    long serialVersionUID

    [Ljava.io.ObjectStreamField; serialPersistentFields

    java.util.Comparator CASE_INSENSITIVE_ORDER

    查看类的构造函数

    public class ClassUtil {

       /**

        * 打印类的信息,包括类的构造函数

        * @param obj该对象所属类的信息

        */

        public static void printConstructorMessage(Object obj) {

             /*

              *打印构造函数信息,构造函数也是对象

              * java.lang.Constructor中封装了构造函数的信息

              * getConstructors()获取所有的public的构造函数

              * .getDeclaredConstructors()得到所有的public的构造方法

              */

             Class c=obj.getClass();

             //Constructor[] cs=c.getConstructors();

             Constructor[] cs=c.getDeclaredConstructors();

             for(int i=0;i<cs.length;i++){

                  System.out.print(cs[i].getName()+"(");

                  //获取构造函数的参数列表

                  Class[] paramTypes=cs[i].getParameterTypes();

                  for(int j=0;j<paramTypes.length;j++){

                        System.out.print(paramTypes[j].getName()+",");

                  }

                  System.out.println(")");

             }

        }

    public static void main(String[] args) {

               String s="hello";

               ClassUtil.printConstructorMessage(s);

     }

    }

    }

    打印结果:

    java.lang.String([B,int,int,)

    java.lang.String([B,java.nio.charset.Charset,)

    java.lang.String([B,java.lang.String,)

    java.lang.String([B,int,int,java.nio.charset.Charset,)

    java.lang.String([B,int,int,java.lang.String,)

    java.lang.String([C,boolean,)

    java.lang.String(java.lang.StringBuilder,)

    java.lang.String(java.lang.StringBuffer,)

    java.lang.String([B,)

    java.lang.String([I,int,int,)

    java.lang.String()

    java.lang.String([C,)

    java.lang.String(java.lang.String,)

    java.lang.String([C,int,int,)

    java.lang.String([B,int,)

    java.lang.String([B,int,int,int,)

  • 相关阅读:
    [置顶] RGB颜色查询对照表
    3.3FactoryMethod——工厂方法
    从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
    C# 自定义事件
    Qt4--加密日记本(子例化QMainWindow文本加密解密)
    SharePoint PerformancePoint Service-PowerShell
    Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题解决办法
    Char* ,CString ,WCHAR*之间的转换
    [C++基础]关键词volatile
    备忘--简单比较SPSS、RapidMiner、KNIME以及Kettle四款数据分析工具
  • 原文地址:https://www.cnblogs.com/weink1215/p/4497637.html
Copyright © 2020-2023  润新知