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);
}
复制代码

 

目录
相关文章
|
开发工具 数据安全/隐私保护 Windows
linphone安装和使用教程
<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 刚刚搞通linphone,终于能连上sip.linphone.org了,中间过程太心酸了。</p> <p style="color:rgb(51,51,51); font-family:Arial; font-size
9757 0
|
消息中间件 运维 监控
使用日志服务LogHub替换Kafka
前几天有客户问到,云上有什么服务可以替换Kafka? 怀着程序员的一丝小小的骄傲回复:日志服务(原SLS)下LogHub功能可以完全替代Kafka等产品,并且在性能、易用性和稳定性上更佳。 但客户将信将疑,于是花了一天时间整理一篇文章,简单从各个角度解释下为何建议用户从自搭Kafka换成
31773 12
|
缓存 Java 关系型数据库
GemFire 异步写和同步读
GemFire 异步写和同步读介绍
5140 0
|
存储 数据处理 云计算
阿里云邮箱怎么注册
www.jinlehao.com 金乐豪
9702 0
|
分布式计算 大数据 Java
Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍
学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子。hadoop-mapreduce-examples项目中还提供了这些例子,本文就其中例子的执行方式进行分析。看看它能否让我们学习mapreduce编程变得更加容易。
5107 0
|
Python Windows 测试技术