zoukankan      html  css  js  c++  java
  • Java中的反射

    一,反射是什么

      Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

      “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C# 不是动态语言。但是Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完 全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对 象实体、或对其fields设值、或唤起其methods。

    二, 反射能干什么

      在运行时判断任意一个对象所属的类

      在运行时构造任意一个类的对象

      • 在运行时判断任意一个类所具有的成员变量和方法

       在运行时调用任意一个对象的方法

    三,包含类型信息的类-Class

    1,如何获得Class对象

      在程序运行时,系统始终为所有的对象维护一个被称为运行时的类型标识,它保存着每个对象所属的类足迹,虚拟机利用运行时信息选择相应的方法执行。保存这些信息的类被称为Class,有三种方法获得Class对象

      a,使用Object.getClass方法,该方法返回一个Class类型的实例。

      b,使用静态方法forName获得类名对应的Class对象,需要注意的是该方法会抛出一个异常,需要对其进行捕获。

    1 String className = "java.util.Date";
    2 Class cl = Class.forName(className);  
      c,若T是任意的Java类型,T.class返回一个匹配的Class对象。
    1 Class cl1 = Date.class;
    2 Class cl2 = int.class;
    3 Class cl3 = Double[].class;
      虚拟机为每一个类型管理一个Class对象,可以利用==操作符比较不同的Class对象是否相等。
    2,Class类的重要API
      静态方法forName以类名作为参数,返回一个Class对象
      getFields,getMethods和getConstructors分别返回类提供的public域,方法和构造器数组,其中包括超类的成员。
      getDeclareFields,getDeclareMethods和getDeclareConstructors分别返回类中声明的全部域,方法和构造器,包括私有和保护成员,但是不包括超类的成员。

    四, 利用反射分析类
    1,核心类概述

      java.lang.reflect中有三个类Field,Method和Constructor分别用于描述类的域,方法和构造器。

      三个类都有getName方法返回条目的名称,都有getModifiers方法返回一个整型数值表示public和static修饰符的使用状况。对于返回的整型值,可以调用java.lang.reflect.Modifier类的静态方法,比如isPublic,isPrivate或isFinal等进行判断,还可以使用Modifier.toString将修饰符打印出来。

      Field类有一个getType方法用来返回描述域所属类型的Class对象。

      Method具有能够报告参数和返回类型的方法。

      Constructor具有能够报告参数类型的方法。

    2,使用步骤

      a,使用第三点中的任意一种方法获得Class对象。

      b,通过Class对象调用getDeclareFields获得域数组,Method和Constructor与之类似。

      c,遍历该数组,解析出修饰符,参数类型,返回类型等信息。

    3,示例

     1 import java.lang.*;
     2 import java.lang.reflect.*;
     3 import java.util.*;
     4 
     5 public class test
     6 {
     7     public static void main(String[] args)
     8     {
     9         String className = "java.lang.Double";
    10 /*
    11         if(args.length == 0)
    12         {
    13             Scanner in = new Scanner(System.in);
    14             className = in.next();
    15         }
    16         else
    17         {
    18             className = args[0]; }
    19 */
    20         try
    21         {
    22             Class cl = Class.forName(className);
    23             String modifiers = Modifier.toString(cl.getModifiers());
    24             System.out.printf(modifiers);
    25             System.out.printf(" class " + className);
    26             System.out.println();
    27             System.out.println("{");
    28             printFields(cl);
    29             System.out.println();
    30             printConstructors(cl);
    31             System.out.println();
    32             printMethods(cl);
    33             System.out.println();
    34             System.out.println("}");
    35         }
    36         catch(ClassNotFoundException e)
    37         {
    38             e.printStackTrace();
    39         }
    40     }
    41     public static void printFields(Class cl)
    42     {
    43         Field[] fields = cl.getDeclaredFields();
    44         for(Field field: fields)
    45         {   
    46             String modifiers = Modifier.toString(field.getModifiers());
    47             System.out.println("    " + modifiers + " " +
    48                 (field.getType()).getName() + " " + field.getName() + ";");
    49         }
    50     }
    51     public static void printMethods(Class cl)
    52     {
    53         Method[] methods = cl.getDeclaredMethods();
    54         for(Method method: methods)
    55         {
    56             String modifiers = Modifier.toString(method.getModifiers());
    57             System.out.printf(" " + modifiers + " " + method.getReturnType().getName()
    58                 + " " + method.getName() + "(");
    59             Class[] paraTypes = method.getParameterTypes();
    60             for(int i = 0; i < paraTypes.length; ++i)
    61             {
    62                 if(i > 0)
    63                     System.out.printf(", ");
    64                 System.out.printf(paraTypes[i].getName());
    65             }
    66             System.out.println(");");
    67             //System.out.println(method.toString());
    68         }
    69     }
    70     public static void printConstructors(Class cl)
    71     {
    72         Constructor[] constructors = cl.getDeclaredConstructors();
    73         for(Constructor constructor: constructors)
    74         {
    75             String modifiers = Modifier.toString(constructor.getModifiers());
    76             System.out.printf(" " + modifiers + " " + constructor.getName()
    77                 + " " + "(");
    78             Class[] paraTypes = constructor.getParameterTypes();
    79             for(int i = 0; i < paraTypes.length; ++i)
    80             {
    81                 if(i > 0)
    82                     System.out.printf(", ");
    83                 System.out.printf(paraTypes[i].getName());
    84             }
    85             System.out.println(");");
    86         }
    87     }
    88 }

    输出结果为:

     1 public final class java.lang.Double
     2 {
     3     public static final double POSITIVE_INFINITY;
     4     public static final double NEGATIVE_INFINITY;
     5     public static final double NaN;
     6     public static final double MAX_VALUE;
     7     public static final double MIN_NORMAL;
     8     public static final double MIN_VALUE;
     9     public static final int MAX_EXPONENT;
    10     public static final int MIN_EXPONENT;
    11     public static final int SIZE;
    12     public static final int BYTES;
    13     public static final java.lang.Class TYPE;
    14     private final double value;
    15     private static final long serialVersionUID;
    16 
    17     public java.lang.Double (double);
    18     public java.lang.Double (java.lang.String);
    19 
    20     public boolean equals(java.lang.Object);
    21     public static java.lang.String toString(double);
    22     public java.lang.String toString();
    23     public int hashCode();
    24     public static int hashCode(double);
    25     public static double min(double, double);
    26     public static double max(double, double);
    27     public static native long doubleToRawLongBits(double);
    28     public static long doubleToLongBits(double);
    29     public static native double longBitsToDouble(long);
    30     public volatile int compareTo(java.lang.Object);
    31     public int compareTo(java.lang.Double);
    32     public byte byteValue();
    33     public short shortValue();
    34     public int intValue();
    35     public long longValue();
    36     public float floatValue();
    37     public double doubleValue();
    38     public static java.lang.Double valueOf(java.lang.String);
    39     public static java.lang.Double valueOf(double);
    40     public static java.lang.String toHexString(double);
    41     public static int compare(double, double);
    42     public static boolean isNaN(double);
    43     public boolean isNaN();
    44     public static boolean isInfinite(double);
    45     public boolean isInfinite();
    46     public static boolean isFinite(double);
    47     public static double sum(double, double);
    48     public static double parseDouble(java.lang.String);
    49 
    50 }
    View Code
     
     
     
  • 相关阅读:
    Linux文件和目录的权限
    nginx的默认web目录
    SSH-keygen rsa 密钥对根据私钥生成公钥
    对ajax的理解
    开关式复选框的操作
    关于弹框和原页面的切换问题
    单选框和复选框中value值得获取
    php中明明写了类函数,却报致命错误找不到类
    python函数
    python关键字
  • 原文地址:https://www.cnblogs.com/yxl10/p/4162067.html
Copyright © 2011-2022 走看看