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(";\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);
}
java获取类的信息的更多相关文章
- [Java反射基础二]获取类的信息
本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...
- java获取当前操作系统的信息
java获取当前操作系统的信息 JavaOS虚拟机UnixEXT 从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...
- java获取天气预报的信息
运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Java 反射(二)运行时获取类的信息
目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...
- Java 获取所有子类信息
我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...
- Java 获取到配置文件信息
Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...
- JAVA获取系统相关信息
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003596 获取JRE系统相关参数 java 通过S ...
- Java获取系统相关信息System.getProperty()
java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...
随机推荐
- 【ORACLE】ORA-12537 问题整理
ORA-12537主要是ORALCE 监听问题,今天帮同事处理问题时,他问道一种情况,开始连接很正常,后续多次出现ORA-12537问题 简单整理了下 一般请况下 1-检查数据库服务器是否没有启动监听 ...
- c# Repeater中CommandArgument传多个参数
<ItemTemplate> <div onmouseover="javascript:this.style.cursor='hand ...
- JAVA自定义注解
在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...
- Centos7强制卸载Mariadb
之前安装过Mariadb 10.2.1版本,现在安装10.1.19版本,提示安装成功了,其实是失败的.MariaDB-server 提示已经安装,通过 rpm qa|grep MariaDB 查看 发 ...
- Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 数据库版本信息 : 10.1.20- ...
- WPF整理-跨程序集访问资源
“Sometimes binary resources are defined in one assembly (typically a class library), but areneeded i ...
- Hbuilder开发HTML5 APP之创建子页面
折腾了好久,终于看明白怎么创建了: 1.创建个html5的mui页面,在其初始化方法中: mui.init({ subpages:[{ id:"list", url: ...
- for 循环中 continue
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
- 基于ajax与msmq技术的消息推送功能实现
周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...