java获取类的信息-阿里云开发者社区

开发者社区> 开发与运维> 正文

java获取类的信息

简介:

v关键技术剖析

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(";\n");
        }
        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(";\n");
        }
        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(";\n");
        }
        return buf.toString();
    }
    
    public void getClassMessage(){
        StringBuffer buf = new StringBuffer();
        try {
            Class<?> c = Class.forName("com.test.Main");
            buf.append("/*类的声明*/\n");
            buf.append(getClassStatement(c));
            buf.append("\n");
            buf.append("    /*字段*/\n");
            buf.append(getFields(c));
            buf.append("    /*构造器*/\n");
            buf.append(getConstructors(c));
            buf.append("    /*方法*/\n");
            buf.append(getMethods(c));
            buf.append("}\n");
            System.out.println(buf.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception{
         new Main().getClassMessage();
    }
}
复制代码

v输出结果

复制代码
/*类的声明*/
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);
}
复制代码

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章