关键技术剖析

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.htmlbuf.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();}
}

输出结果

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

转载于:https://www.cnblogs.com/hujunzheng/p/5132943.html

java获取类的信息相关推荐

  1. java反射 获取方法_java反射之获取类的信息方法(推荐)

    本文接上文"老生常谈反射之class类的使用(必看篇)",以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获 ...

  2. Java知识点总结(反射-获取类的信息)

    Java知识点总结(反射-获取类的信息) @(Java知识点总结)[Java, 反射] 应用反射的API,获取类的信息(类的名字.属性.方法.构造器等) import java.lang.reflec ...

  3. java获取主机信息大全,网络编程:Java获取网络主机信息

    java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...

  4. Java获取异常堆栈信息

    Java获取异常堆栈信息 参考文章: (1)Java获取异常堆栈信息 (2)https://www.cnblogs.com/zhi-leaf/p/6288769.html 备忘一下.

  5. 【hadoop】java 获取 yarn app 信息 报错 ConfiguredRMFailoverProxyProvider - Failing over to rm2

    文章目录 1.概述 1.概述 java 获取 yarn app 信息 报错 ConfiguredRMFailoverProxyProvider - Failing over to rm2 2022-0 ...

  6. java 获取_java获取类的信息

    packagecom.test;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.re ...

  7. Java基础-通过反射获取类的信息

    目录 1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8.反射Constructor ...

  8. java反射获取实现类_Java介绍通过反射获取类的信息

    免费学习推荐:java基础教程 目录1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8 ...

  9. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

最新文章

  1. E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: U
  2. 【毕设进行时-工业大数据,数据挖掘】Java GUI完善,左对齐
  3. c++ vector clear()清除容器中所有数据
  4. php 让字体闪烁,js实现文字闪烁特效的方法
  5. 安装JAVA 运行环境
  6. 牛客网【每日一题】4月29日题目精讲 Symmetric Matrix
  7. 单基因GSEA怎么做?
  8. [Asp.net core]使用Polly网络请求异常重试
  9. Hexo瞎折腾系列(6) - 将博客同时部署到Github和Coding
  10. 如何获取Java用户输入?
  11. 高级软件测试11.27日小组工作-1701班第5组
  12. ACM算法笔记(一)模拟算法【详细解析】
  13. 机器学习-验证策略总结【交叉验证、验证集方法】
  14. win10共享其它计算机文件,两台win10间如何文件共享
  15. Smartbi的安装部署
  16. dell电脑 驱动下载地址
  17. ctf夏季集训结训赛-简单题writeup
  18. Unity Super TileMap Editor使用帮助翻译
  19. 有故事的书单:June, 2018
  20. AI智能联系人管理系统(一)

热门文章

  1. select事件有哪些_Android 深入底层:Linux事件管理机制 epoll
  2. java逻辑量_java – 增量逻辑
  3. 达梦数据库连接(单机、多实例、多数据源版本)
  4. Docker 查看日志记录
  5. 使用Axios拦截器打印前端请求日志和后端后返回日志
  6. 发送http和https请求工具类 Json封装数据
  7. 如何利用tcpdump抓包?
  8. Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
  9. python三维模型_python三维模型
  10. activiti动态办理人_安全生产许可证办理相关问题