Java反射

一、利用反射获取类的能力(利用反射检查类的结构)

先来看看代码

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        
        reflect("java.lang.Double");
    }
    
    /*
     * 反射
     */
    public static void reflect(String className){
        
        try {
            //根据类的完整名称获取到类的实例
            Class cl = Class.forName(className);
            Class supercl = cl.getSuperclass(); //获取父类
            String modifiers = Modifier.toString(cl.getModifiers());
            if(modifiers.length()>0){
                System.out.print(modifiers+" ");
            }
            System.out.print("class " + className);
            if(supercl != null && supercl != Object.class){
                System.out.print(" extends " + supercl.getName());
            }
            System.out.print("
{
");
            printConstructors(cl);  //打印构造方法
            System.out.println();
            printMethods(cl);   //打印类的所有方法
            System.out.println();
            printFields(cl);   //这里打印类的字段 
            System.out.println("}");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    /*
     * 打印某个class的全部的构造函数
     */
    public static void printConstructors(Class cl){
        //获取当前class的全部构造方法
        Constructor[] constructors = cl.getDeclaredConstructors();
        
        //遍历每一个构造方法
        for(Constructor c:constructors){
            //获取构造方法的方法名称
            String name = c.getName();
            System.out.print("  ");
            String modifiers = Modifier.toString(c.getModifiers());
            
            if(modifiers.length()>0){
                //打印修饰符 public 
                System.out.print(modifiers + " ");
            }
            //打印构造方法名称
            System.out.print(name + "(");
            
            //获取构造方法的参数类型
            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0;j<paramTypes.length ;j++){
                if(j>0){
                    System.out.print(", ");
                }
                //打印参数名称
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }
    
    /*
     * 打印类的所有方法
     * @param cl
     */
    public static void printMethods(Class cl){
        //获取方法的集合
        Method[] methods = cl.getDeclaredMethods();
        
        //遍历方法
        for(Method m : methods){
            
            //获取方法的返回类型
            Class retType = m.getReturnType();
            //获取方法名称
            String name = m.getName();
            System.out.print("  ");
            
            //获取方法修饰符
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length()>0){
                //打印方法的修饰符
                System.out.print(modifiers+" ");
            }
            //打印返回类型和方法名称
            System.out.print(retType.getName() + " " + name + "(");
            
            //获取方法的 参数类型 
            Class[] paramTypes = m.getParameterTypes();
            for(int j = 0;j < paramTypes.length ;j++){
                
                if(j>0){
                    //大于两个参数的用逗号隔开
                    System.out.print(", ");
                }
                //打印方法的参数名称
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
            
        }
    } 
    
    /*
     * 打印所有字段 
     * @param cl
     */
    public static void printFields(Class cl){
        //获取类的所有全局变量字段
        Field[] fields = cl.getDeclaredFields();
        
        for(Field f : fields){
            //获取字段的类型 例如 :int ,String  等
            Class type = f.getType();
            //获取字段名称
            String name = f.getName();
            System.out.print("  ");
            //获取字段的修饰符  例如:public 或者private或者public static final等
            String modifiers = Modifier.toString(f.getModifiers());
            if(modifiers.length()>0){
                //打印字段的修饰符
                System.out.print(modifiers +" ");
            }
            //打印字段的数据类型和字段名称
            System.out.println(type.getName() + " " + name + ";");
        }
    }
    
}

打印出的结果是:

public final class java.lang.Double extends java.lang.Number
{
  //构造方法
  public java.lang.Double(double);
  public java.lang.Double(java.lang.String);

  //类的方法
  public boolean equals(java.lang.Object);
  public static java.lang.String toString(double);
  public java.lang.String toString();
  public int hashCode();
  public static int hashCode(double);
  public static double min(double, double);
  public static double max(double, double);
  public static native long doubleToRawLongBits(double);
  public static long doubleToLongBits(double);
  public static native double longBitsToDouble(long);
  public volatile int compareTo(java.lang.Object);
  public int compareTo(java.lang.Double);
  public byte byteValue();
  public short shortValue();
  public int intValue();
  public long longValue();
  public float floatValue();
  public double doubleValue();
  public static java.lang.Double valueOf(java.lang.String);
  public static java.lang.Double valueOf(double);
  public static java.lang.String toHexString(double);
  public static int compare(double, double);
  public static boolean isNaN(double);
  public boolean isNaN();
  public static boolean isFinite(double);
  public static boolean isInfinite(double);
  public boolean isInfinite();
  public static double sum(double, double);
  public static double parseDouble(java.lang.String);

  //类的字段
  public static final double POSITIVE_INFINITY;
  public static final double NEGATIVE_INFINITY;
  public static final double NaN;
  public static final double MAX_VALUE;
  public static final double MIN_NORMAL;
  public static final double MIN_VALUE;
  public static final int MAX_EXPONENT;
  public static final int MIN_EXPONENT;
  public static final int SIZE;
  public static final int BYTES;
  public static final java.lang.Class TYPE;
  private final double value;
  private static final long serialVersionUID;
}

 在java.lang.reflect包(反射包) 中有三个类Field 、Method 和Constructor 分别用于描述类的域、方法、构造器。

从上面的代码中我们可以分析

我们先从类开始分析

上面我们传入了java.lang.Double

  Class  

Class cl = Class.forName(String className);   //获取类    

cl.getSuperclass(); //获取父类  

cl.getModifiters(); //获取类的修饰符

cl.getDeclaredConstructors(); //获取类中所有的构造方法

cl.getDeclaredMethods(); //获取类中所有的方法

cl.getDeclaredFields();  //获取类中所有的字段

  Constructors类

constructors类:public java.lang.Double(double);取上面输出结果的其中一条用来举例说明

constructors.getModifiters(); //获取构造方法的修饰符采用这种方式获取Modifier.toString(c.getModifiers()); :public 

constructors.getName(); //获取构造方法名 java.lang.Doublie

constructors.getParameterTypes(); //获取所有参数数据类型  double

  Method类

method类:  public boolean equals(java.lang.Object); //理由同上

method.getModifiters(); //获取方法的修饰符采用这种方式获取Modifier.toString(m.getModifiers());  :public

method.getReturnType(); //获取方法的返回类型 :boolean

method.getName(); //获取方法名 :equals

method.getParameterTypes(); //获取所有参数的数据类型  返回的是数组 :java.lang.Object

      Field类

Field类:public static final double MAX_VALUE; 是类的字段中的一条我们用来分析

Field.getName(); //获取字段的名称: MAX_VALUE

Field.getType();  //获取字段的数据类型 :double

Field.getModifiers(); //获取字段的修饰符采用这种方式获取Modifier.toString(f.getModifiers()); :public static final  

仔细看上面的三个类有共同名称的方法,归纳以下还是便于记忆的,那么就先介绍到这儿了。

原文地址:https://www.cnblogs.com/woaixingxing/p/7551378.html