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.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FAT32文件系统介绍

FAT32文件系统&#xff08;一&#xff09;为什么要有文件系统&#xff08;二&#xff09;FAT32文件系统组成&#xff08;三&#xff09;分步介绍各部分(1) 首先介绍一下MBR(2)DBR介绍(3)FAT表介绍(4) 数据区&#xff08;一&#xff09;为什么要有文件系统 文件系统是操作系统用…

java中动态代理实现机制

前言&#xff1a; 代理模式是常用的java设计模式&#xff0c;它的特征是代理类与委托类有同样的接口&#xff0c;代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类&#xff0c;以及事后处理消息等。代理类与委托类之间通常会存在关联关系&#xff0c;一个代理类…

libiconv库简单裁剪支持CP437编码

有许多人在做项目的时候都会遇到字符编码的不一致导致的乱码问题&#xff0c;那如何去解决呢&#xff1f;在Linux系统上可以通过iconv函数族来进行编码转换&#xff0c;但有时候我们并不需要全部的字符集&#xff0c;因为可能会占用比较大的空间&#xff0c;本文主要支持CP437编…

简单java在线测评程序

简单java程序在线测评程序 一&#xff0e;前言 大家过年好&#xff01;今年的第一篇博客啊&#xff01;家里没有网&#xff0c;到处蹭无线&#xff01;日子过得真纠结&#xff01;因为毕设的需求&#xff0c;简单写了一个java程序在线测评程序&#xff0c;当然也可以在本地测试…

指针强制类型转换触发内存自动对齐

C语言的指针是我们操作很灵活&#xff0c;但是也留下了不少坑&#xff0c;今天工作遇到了一个指针的坑&#xff0c;这里复现一下&#xff1a; 指针类型强制转换,并进行解引用,引起的内存对齐问题.&#xff08;一&#xff09;问题复现&#xff1a; 运行环境&#xff1a;Ubuntu …

简单文本编辑器

一、前言 聚天地之灵气&#xff0c;集日月之精华&#xff01;一个简单的java文本编辑器由此而生。毕设所需&#xff0c;很是无奈&#xff01; 二、界面预览 三、实现思路 1.字体选择器的实现 (1).字体类 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出现data abort

&#xff08;一&#xff09;问题描述 u-boot下新增了一条update的命令&#xff0c;直接输入update没有报错&#xff0c;但是输入up按TAB键补全时发现出现data abort&#xff0c;而且输入不支持的命令也会有data abort &#xff08;二&#xff09;解决方法 最开始我包含的头…

sublime text学习

Ctrl / ---------------------注释 Ctrl 滚动 --------------字体变大/缩小 Ctrl N-------------------新建 软件右下角可以选择文档语法模式 Ctrl Shift P ------------------命令模式 命令&#xff1a; sshtml模糊匹配-----语法切换到html模式&#xff0c;同理所得&am…

core文件如何分析

目录(一&#xff09;什么是coredump(二)coredump产生的条件&#xff08;1&#xff09;coredump产生主要原因&#xff1a;&#xff08;2&#xff09;如何生成coredump(三&#xff09;gdb使用(四&#xff09;实例调试coredump文件(五&#xff09;总结(一&#xff09;什么是coredu…

SpringMVC+FreeMarker

前言&#xff1a; 最近在学习SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前没有接触过。利用SpringMVC开发其实还有许多的步骤&#xff0c;比如控制层&#xff0c;服务层&#xff0c;持久化层&#xff0c;实体等等&#xff0c;先弄了一个小demo来总结一下Spr…

SpringMVC那点事

一、SpringMVC返回json数据的三种方式 1、第一种方式是spring2时代的产物&#xff0c;也就是每个json视图controller配置一个Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js学习内容的整理

1、jquery动态添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最邻近插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;最邻近插值实现&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;最邻近插值实现 一般情况下我…

(二)双线性插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;双线性插值原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;双线性插值原理 一般情况下我…

js self = this的解释

Demo 1: function Person(){this.name hjzgg;this.age 24;this.show function(){alert(name " " age);}}var p new Person();p.show(); 错误&#xff1a;name 和 age都没有定义。 Demo 2: function Person(){this.name hjzgg;this.age 24;this.show functio…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…

SD卡实例分析fat32文件系统

目录 环境描述 分析过程 1.SD卡格式化 2.使用winhex打开sd卡 3.MBR分析 4.DBR分析

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...&#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 关键字&#x…

基于matlab的步进电机仿真(一)

这里写目录标题环境准备基础准备模型参数输入和输出仿真原理图仿真资源环境准备 MatLab2021b 基础准备 打开Matlab&#xff0c;在帮助文档里面搜索step motor,我们这里选择如下模型 该模型实现了一个通用的步进电机模型&#xff1a; 可变磁阻步进电机永磁或混合步进电机 …

java自定义类加载器

前言 java反射&#xff0c;最常用的Class.forName()方法。做毕设的时候&#xff0c;接收到代码字符串&#xff0c;通过 JavaCompiler将代码字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse项目中的bin目录里&#xff09;&#xff0c;然后通过jav…