关键技术剖析

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获取类的信息的更多相关文章

  1. [Java反射基础二]获取类的信息

    本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...

  2. java获取当前操作系统的信息

    java获取当前操作系统的信息 JavaOS虚拟机UnixEXT  从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...

  3. java获取天气预报的信息

    运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...

  4. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  5. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  6. Java 获取所有子类信息

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...

  7. Java 获取到配置文件信息

    Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...

  8. JAVA获取系统相关信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003596 获取JRE系统相关参数 java 通过S ...

  9. Java获取系统相关信息System.getProperty()

    java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...

随机推荐

  1. 解决python编码格式错误问题

    一:前言 遇到问题:print输入汉字时提示错误信息 UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: o ...

  2. Linux下Nano命令使用指南

    1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用?   打开或新建文件 #nano 文件名    禁用自动换行 #nano -w /etc/fs ...

  3. JQuery实现Ajax应用

    将自己之前在印象笔记的笔记搬家了~ 1.使用 load()方法异步请求数据,通过Ajax 请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[ ...

  4. ubuntu环境下vmware取消自动启动服务

    概述其实vmware这个服务取不取消,影响不大,主要是我有强迫症,在不用虚拟机的时候,看着vmware占着进程真心不爽,想要解决这个问题,在用虚拟机的时候启动服务,反之,则停.接下来,我说一下实现吧. ...

  5. ajax的理解与工作流程

    一.什么是ajax ajax是一种异步通信技术.在ajax出现之前,客户端与服务端之间直接通信.引入ajax之后,客户端与服务端加了一个第三者--ajax.有了ajax之后,通过在后台与服务器进行少量 ...

  6. 【http代理报文】通过发包实现代理请求网页内容

    工作中,我们难免需要通过TCP/IP协议发送报文来直接请求网页内容(比如爬虫工具),有同学问如何通过HTTP代理来请求网页,其实我们只需要把报文稍稍修改下,发送给代理服务器即可实现. 基础不过关的朋友 ...

  7. 串口计时工具Grabserial简介及修改(添加输入功能)

    Grabserial是Tim Bird用python写的一个抓取串口的工具,这个工具能够为收到的每一行信息添加上时间戳. 如果想对启动时间进行优化的话,使用这个工具就可以简单地从串口输出分析出耗时. ...

  8. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

  9. SQL Server2000清除数据库日志

    sqlserver2000压缩日志 可以将jb51.ldf文件变得很小,方便备份数据库等,在sqlserver查询分析器中执行即可.复制代码 代码如下: DUMP TRANSACTION [jb51] ...

  10. 跨平台网络抓包工具-Microsoft Message Analyzer

    Microsoft Message Analyzer (MMA 2013)是微软最受欢迎的Netmon的最新版本. 在Netmon网络跟踪和排除故障功能的基础上提供了更强大的跨平台网络分析追踪能力.园 ...