关键技术剖析

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. ZooKeeper个人笔记客户端watcher和AsycCallback回调

    每一个Watcher具有如下属性: 1.KeeperState 2.EventType 3.path 4.process(WatchedEvent evnet)回掉方法 Watcher干嘛的?用户监听 ...

  2. id选择器、类选择器、属性选择器

    在网页编辑时,通常要对样式进行各种设置.我们借助CSS样式设计中的选择器,就能很好很方便的对它们进行管理和设置了. 今天,跟大家分享一下几个常用的选择器:id选择器.类选择器.属性选择器. id选择器 ...

  3. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  4. ssh简化后之事务管理

    为了能让大家更好的了解,所以今天跟大家分享整个项目.ps:ssh环境的搭建我就不一一讲解了,请大家参考 http://www.cnblogs.com/zczc1996/p/5842367.html. ...

  5. python中__init__问题

    python中安装目录中的Lib文件夹模块中的__init__.py文件(文件内容可以为空),用于标识此文件夹是一个模块 python编程中的__init__表示初始化

  6. jQuery extend扩展String原型

    jQuery.extend(String.prototype, { isPositiveInteger:function(){ return (new RegExp(/^[1-9]\d*$/).tes ...

  7. JeeSite学习笔记~代码生成原理

    1.建立数据模型[单表,一对多表,树状结构表] 用ERMaster建立数据模型,并设定对应表,建立关联关系 2.系统获取对应表原理 1.怎样获取数据库的表 genTableForm.jsp: < ...

  8. Unity3D UGUI之DoTweenAnimation脚本控制动画方法

    DOTweenAnimation脚本: Loops循环:-1时即永久循环播放. Loops Type 是选择播放模式. Ease属性里有很多,暂时只知道Linear的效果,其他有待单独写. ID下面可 ...

  9. 导向矢量(Steering Vector)

    导向矢量是阵列天线的所有阵元对具有单位能量窄带信源的响应. 由于阵列响应在不同方向上是不同的,导向矢量与信源的方向是相互关联的,这种关联的独特性依赖于阵列的几何结构.对于同一阵元阵列,导向矢量的每一个 ...

  10. Microservice 微服务的理论模型和现实路径

    两年前接触到了微服务的概念,面对日益膨胀的系统感觉豁然开朗.之后的两年逐步把系统按微服务的架构理念进行了重构,并将业务迁移到了新架构之上.感觉现在差不多是时候写一篇关于微服务的总结文章了. 定义 在 ...