再回首,Java温故知新(十一):Java反射

  最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用在工具型项目的开发中,例如Spring。

  在程序运行期间,JRE会为所有的对象创建一个类型标识,保存这些信息的类就是Class类,反射所有的功能都是围绕这个类来实现的,获取方法有以下几种:

    1.new Date().getClass();

    2.Date.class;

    3.Class.forName(java.util.Date)

  基础方法如下(更多方法请查看API):

    1.Class.getName()    返回类名

    2.Class.newInstance()  根据Class对象创建实例

    3.Class.getDeclaredFields()    获取类的属性数组

    4.Class.getDeclaredMethods()   获取类的方法数组

    5.Class.getDeclaredConstructors()  获取类的构造器数组

    6.Field/Method/Constructor.getModifiers()  获取属性/方法/构造器的修饰符

  下面附上一个解析类的DEMO,运行结果如下:

    

  代码如下:

  

package com.demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

/**
 * Java反射获取类内容
 * @author liweitao
 *
 */
public class PrintClass {

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        System.out.println("enter a class name");
        String name = scanner.nextLine();
        
        try {
            Class cls = Class.forName(name);
            String modifier = Modifier.toString(cls.getModifiers());
            Class superCls = cls.getSuperclass();
            Class[] interCls = cls.getInterfaces();
            
            System.out.print(modifier +" class " + name);
            
            if(superCls != null && superCls != Object.class){
                System.out.print(" extends " + superCls.getName());
            }
            
            for(int i = 0; i < interCls.length; i++){
                if(i == 0){
                    System.out.print(" implements ");
                }else if(i > 0){
                    System.out.print(",");
                }
                System.out.print(interCls[i].getName());
            }
            System.out.println("{");
            printFields(cls);
            printConstructors(cls);
            printMethods(cls);
            System.out.print("}");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
        
    }
    
    /**
     * 打印字段
     * @param cls
     */
    public static void printFields(Class cls){
        Field[] fields = cls.getDeclaredFields();
        for(Field field : fields){
            StringBuffer result = new StringBuffer();
            Class type = field.getType();
            String name = field.getName();
            String modifiers = Modifier.toString(field.getModifiers());
            if(modifiers.length() > 0){
                result.append("	").append(modifiers).append(" ")
                    .append(type.getName()).append(" ").append(name);
            }
            System.out.println(result.toString());
        }
    }

    /**
     * 打印构造器
     * @param cls
     */
    public static void printConstructors(Class cls){
        Constructor[] constructors = cls.getDeclaredConstructors();
        for(Constructor constructor : constructors){
            StringBuffer result = new StringBuffer();
            String name = constructor.getName();
            String modifiers = Modifier.toString(constructor.getModifiers());
            if(modifiers.length() > 0){
                result.append("	").append(modifiers).append(" ").append(name).append("(");
            }
            
            Class[] params = constructor.getParameterTypes();
            for(int j = 0; j < params.length; j++){
                if(j > 0){
                    result.append(",");
                }
                result.append(params[j].getName());
            }
            result.append(")");
            System.out.println(result.toString());
        }
    }
    
    public static void printMethods(Class cls){
        Method[] methods = cls.getDeclaredMethods();
        for(Method method : methods){
            StringBuffer result = new StringBuffer();
            String name = method.getName();
            Class returnType = method.getReturnType();
            String modifier = Modifier.toString(method.getModifiers());
            Class[] params = method.getParameterTypes();
            
            if(modifier.length() > 0){
                result.append("	").append(modifier).append(" ")
                    .append(returnType.getName()).append(" ").append(name).append("(");
            }
            
            for(int j = 0; j < params.length; j++){
                if(j > 0){
                    result.append(",");
                }
                result.append(params[j].getName());
            }
            result.append(")");
            System.out.println(result.toString());
        }
    }
    
}
原文地址:https://www.cnblogs.com/aotian/p/4967752.html