• java获取类的信息


    关键技术剖析

    1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包。

    2.Class类的forName方法能够根据类名加载类,获得类的Class对象。

    Class类的getSuperclass方法获得父类的Class对象;getDeclaredFields方法获取类声明的属性,返回的是一组java.lang.Field对象;getDeclaredConstructors方法获得类的构造方法,返回的是一组java.lang.reflect.Constructor对象;getMethods方法获得类的方法,返回的是一组java.lang.reflect.Method的对象。

    3.java.olang.reflect.Field描述类声明的属性。getModifiers方法获得属性的访问修饰符;getType方法获得属性的类型;getName方法获得属性名。

    4.java.lang.reflect.Constructor描述类的构造方法。getModifiers方法获得构造方法的访问修饰符;getName方法获得方法名,getParameterTypes获得构造方法的参数类型;getExCeptionTypes方法获得构造方法声明的异常。

    5.java.lang.reflect.Method描述类声明的方法。getModifiers方法获得方法的访问修饰符;getReturnType方法返回方法的返回类型;getName方法获得方法名;getParameterTypes方法案获得方法的参数类型;getExceptionTypes方法获得声明的异常。

    package com.test;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    public class Main{
        
        /*获取类的声明*/
        private String getClassStatement(Class c){
            StringBuffer buf = new StringBuffer();
            if(c.getName().equals("java.lang.Object")){
                buf.append("public class Object {");
                return buf.toString();
            } else {
                //得到该类的父类名
                String superName = c.getSuperclass().getName();
                buf.append("public class ").append(c.getName()).append(" extends ").append(superName).append(" {");
                return buf.toString();
            }
        }
        
        /*获取类的属性*/
        private String getFields(Class c){
            StringBuffer buf = new StringBuffer();
            Field[] fields = c.getDeclaredFields();
            for(Field field : fields){
                //获取属性的访问修饰符
                //Modifier的一些信息 http://www.it165.net/pro/html/201309/7203.html
                buf.append("    ").append(Modifier.toString(field.getModifiers())).append(" ");
                Class<?> type = field.getType();
                buf.append(type.getName()).append(" ");
                buf.append(field.getName()).append(";
    ");
            }
            return buf.toString();
        }
        
        /*获取类的所有构造方法*/
        private String getConstructors(Class c){
            StringBuffer buf = new StringBuffer();
            //获取类的构造方法
            Constructor<?>[] cons = c.getDeclaredConstructors();
            for(Constructor con : cons){
                //获取构造方法的访问修饰符
                buf.append("    ").append(Modifier.toString(con.getModifiers())).append(" ");
                //获取构造方法的名称
                buf.append(con.getName()).append("(");
                //获取构造方法的参数
                Class<?>[] paramType =  con.getParameterTypes();
                for(int i=0; i<paramType.length; ++i){
                    if(i != 0){
                        buf.append(paramType[i].getName());
                    } else {
                        buf.append(", ").append(paramType[i].getName());
                    }
                }
                buf.append(")");
                
                //获取方法声明的异常
                Class<?>[] excepTypes = con.getExceptionTypes();
                for(int i=0; i<excepTypes.length; ++i){
                    if(i==0){
                        buf.append(" throws ").append(excepTypes[i].getName());
                    } else {
                        buf.append(", ").append(excepTypes[i].getName());
                    }
                }
                buf.append(";
    ");
            }
            return buf.toString();
        }
        
        private String getMethods(Class c){
            StringBuffer buf = new StringBuffer();
            Method[] methods = c.getDeclaredMethods();
            for(Method method : methods){
                //获取方法的访问修饰符
                buf.append("    ").append(Modifier.toString(method.getModifiers())).append(" ");
                //获取方法的返回类型
                Class<?> returnType = method.getReturnType();
                buf.append(returnType.getName()).append(" ");
                buf.append(method.getName()).append(" (");//获取方法的名称
                
                //获取方法的参数类型
                Class<?>[] paramTypes = method.getParameterTypes();
                for(int i=0; i<paramTypes.length; ++i){
                    if(i==0){
                        buf.append(paramTypes[i].getName());
                    } else {
                        buf.append(", ").append(paramTypes[i].getName());
                    }
                }
                buf.append(")");
                
                //获取方法声明的异常
                Class<?>[] excepTypes = method.getExceptionTypes();
                for(int i=0; i<excepTypes.length; ++i){
                    if(i==0){
                        buf.append(" throws ").append(excepTypes[i].getName());
                    } else {
                        buf.append(", ").append(excepTypes[i].getName());
                    }
                }
                buf.append(";
    ");
            }
            return buf.toString();
        }
        
        public void getClassMessage(){
            StringBuffer buf = new StringBuffer();
            try {
                Class<?> c = Class.forName("com.test.Main");
                buf.append("/*类的声明*/
    ");
                buf.append(getClassStatement(c));
                buf.append("
    ");
                buf.append("    /*字段*/
    ");
                buf.append(getFields(c));
                buf.append("    /*构造器*/
    ");
                buf.append(getConstructors(c));
                buf.append("    /*方法*/
    ");
                buf.append(getMethods(c));
                buf.append("}
    ");
                System.out.println(buf.toString());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) throws Exception{
             new Main().getClassMessage();
        }
    }

    输出结果

    /*类的声明*/
    public class com.test.Main extends java.lang.Object {
        /*字段*/
        /*构造器*/
        public com.test.Main();
        /*方法*/
        private java.lang.String getClassStatement (java.lang.Class);
        public void getClassMessage ();
        public static void main ([Ljava.lang.String;) throws java.lang.Exception;
        private java.lang.String getConstructors (java.lang.Class);
        private java.lang.String getFields (java.lang.Class);
        private java.lang.String getMethods (java.lang.Class);
    }
  • 相关阅读:
    面试题目整理(MySQL系列-调优)
    面试题目整理(MySQL系列-事务)
    面试题目整理(MySQL系列-索引)
    MySQL遇到问题
    Gorm的高级用法
    Gorm的初步使用(使用频率排序)
    MySQL索引详解
    SSH命令行上传/下载文件
    SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation 'like' 。。。
    Redis 缓存穿透、缓存雪崩、缓存击穿解决方案
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/5132943.html
Copyright © 2020-2023  润新知