关键技术剖析

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. BZOJ4488: [Jsoi2015]最大公约数

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R ...

  2. redis 下载及使用

    redis 官网下载地址:http://redis.io/ E:\工作软件\新建文件夹\redis64-2.8.19  redis-server.exe 执行该命令 当前已启动  端口号:6379 r ...

  3. 向mysql中插入Date类型的数据

    先看数据库表的定义 date字段为sql.date类型.我要向其中插入指定的日期和当前日期. 一.插入当前日期 思路:先获取当前系统,在将当前系统时间转换成sql类型的时间,然后插入数据库.代码如下 ...

  4. 使用THINKPHP中的控制器和模块查询数据库

    1,自定义一个UserController的控制器,导入tp的控制器与模块执行相应的操作. ----var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值. ...

  5. mui框架中底部导航的跳转2

    接上一篇 还有一种方法就是在一心得页面中打开我们所需要的网页 代码如下: 向新的的页面穿值: 获取到新页面上的值:

  6. Lua源代码阅读分析问题列表(转)

    最近正在阅读lua源码,遇到座灯塔,转载如下: 我个人的习惯是带着问题去研究一个新题目,比如这次阅读Lua代码,暂列下面这些问题. 1)什么是基于栈.基于寄存器的虚拟机(VM)设计?Lua如何实现基于 ...

  7. solr使用语法笔记

    http://127.0.0.1:8095/shangbiao_sale/select?sort=id+desc&fq=&wt=json&json.nl=map&q=s ...

  8. CSS篇之DIV+CSS布局

    <div></div> div与其他标签一样,也是一个XHTML所支持的标签. div是XHTML中指定的,远门用于布局设计的容器标记. 简单的CSS布局 头部 内容 页脚 & ...

  9. SQL Server 2016 CTP2.2 的关键特性

    SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库 ...

  10. Visual Studio 2015 CTP6 发布

    微软发布ASP.NET 5 支持在Windows.Mac和Linux上构建程序,Visual Studio 2015 CTP6(社区预览版)现已发布了.感兴趣的朋友们可以登录官网下载[http://w ...