zoukankan      html  css  js  c++  java
  • 再回首,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());
            }
        }
        
    }
  • 相关阅读:
    csu1804
    uvalive4513
    poj3264(Sparse-Table 算法模板)
    uva11107(后缀数组)
    poj2774(最长公共子串)
    uvalive4108(线段树)
    hdu5306 Gorgeous Sequence
    bzoj2823: [AHOI2012]信号塔&&1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖
    bzoj3330: [BeiJing2013]分数
    bzoj1283: 序列
  • 原文地址:https://www.cnblogs.com/aotian/p/4967752.html
Copyright © 2011-2022 走看看