Java利用反射取得类的所有信息
Java中可以利用反射获取类的名称、构造函数、属性、方法。也就是说可以通过反射可以取得类的所有信息(不管该成员是否封装为private).
如有下面的Dept类定义:
package org.lyk.vo; import org.lyk.utils.MyFlag;
import org.lyk.utils.MyService; import java.io.Serializable;
import java.text.NumberFormat; public class Dept implements Serializable
{
private Integer deptno;
private String dname;
private String loc;
private Company company; protected void print()
{ }
private void show()
{
System.out.println("");
} public Dept() throws NumberFormatException,NullPointerException,ClassNotFoundException
{
} public Dept(Integer deptno, String dname, String loc, Company company)
{
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
this.company = company;
} public Company getCompany()
{
return company;
} public void setCompany(Company company)
{
this.company = company;
} public Integer getDeptno()
{
return deptno;
} public void setDeptno(Integer deptno)
{
this.deptno = deptno;
} public String getDname()
{
return this.dname;
} public void setDname(String dname)
{
this.dname = dname;
} public String getLoc()
{
return loc;
} public void setLoc(String loc)
{
this.loc = loc;
} @Override
@Deprecated
public String toString()
{
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
public void showError()throws NumberFormatException
{}
}
下面的代码是通过反射获取该类的所有信息:
package org.lyk.main; import org.lyk.utils.*;
import org.lyk.vo.Container;
import org.lyk.vo.Dept;
import org.lyk.vo.IFruit;
import sun.misc.Unsafe; import java.lang.annotation.Annotation;
import java.lang.reflect.*; public class Hello
{
public static void main(String[] args) throws Exception
{
Class cls = Dept.class;
//打印类名称信息
printName(cls);
//打印属性信息
printFields(cls);
System.out.println("\n");
//打印构造函数
printConstructors(cls);
System.out.println("\n");
//打印方法
printMethods(cls);
System.out.println("}"); } public static void printConstructors(Class cls)
{
Constructor[] constructors = cls.getConstructors();
for (Constructor c : constructors)
{
StringBuffer buf = new StringBuffer();
buf.append("\t");
buf.append(Modifier.toString(c.getModifiers()));
buf.append(" ");
String fullName = c.getName();
buf.append(fullName.substring(fullName.lastIndexOf(".") + 1));
buf.append("(");
setParameters(c,buf);
buf.append(")");
setExceptions(c,buf);
System.out.println(buf);
}
} public static void printName(Class cls)
{
StringBuffer buf = new StringBuffer();
buf.append(Modifier.toString(cls.getModifiers()));
buf.append(" class ");
buf.append(cls.getSimpleName());
Class superClass = cls.getSuperclass();
if (superClass != null)
{
if (!superClass.getSimpleName().equalsIgnoreCase("Object"))
{
buf.append(" extends ");
buf.append(superClass.getSimpleName());
}
}
Class[] interfaces = cls.getInterfaces();
if (interfaces.length > 0)
{
buf.append(" implements ");
for (Class itf : interfaces)
{
buf.append(itf.getSimpleName());
buf.append(",");
}
buf.delete(buf.length() - 1, buf.length());
} buf.append("\n{");
System.out.println(buf.toString());
} public static void printFields(Class cls)
{
Field[] fields = cls.getDeclaredFields();
for (Field field : fields)
{
StringBuffer buf = new StringBuffer();
buf.append("\t");
buf.append(Modifier.toString(field.getModifiers()));
buf.append(" ");
buf.append(field.getType().getSimpleName());
buf.append(" ");
buf.append(field.getName());
buf.append(";");
System.out.println(buf.toString());
}
}
public static void printMethods(Class cls)
{
Method[] methods = cls.getDeclaredMethods();
for(Method m : methods)
{
StringBuffer buf = new StringBuffer("\t");
buf.append(Modifier.toString(m.getModifiers()));
buf.append(" ");
buf.append(m.getReturnType().getSimpleName());
buf.append(" ");
buf.append(m.getName());
buf.append("(");
setParameters(m,buf);
buf.append(")");
setExceptions(m,buf);
System.out.println(buf.toString());
}
}
public static void setParameters(Executable c,StringBuffer buf)
{ Class[] parameterTypes = c.getParameterTypes();
if (parameterTypes.length > 0)
{
int index = 0;
for (Class parameterType : parameterTypes)
{
buf.append(parameterType.getSimpleName());
buf.append(" arg");
buf.append(index++);
buf.append(",");
}
buf.delete(buf.length() - 1, buf.length());
}
}
public static void setExceptions(Executable c,StringBuffer buf)
{ Class[] exceptionTypes = c.getExceptionTypes();
if(exceptionTypes.length > 0)
{
buf.append(" throws ");
for(Class exceptionType : exceptionTypes)
{
buf.append(exceptionType.getSimpleName());
buf.append(",");
}
buf.delete(buf.length()-1,buf.length());
}
}
}
输出信息:
public class Dept implements Serializable
{
private Integer deptno;
private String dname;
private String loc;
private Company company; public Dept() throws NumberFormatException,NullPointerException,ClassNotFoundException
public Dept(Integer arg0,String arg1,String arg2,Company arg3) public String toString()
protected void print()
public String getDname()
private void show()
public Company getCompany()
public void setCompany(Company arg0)
public Integer getDeptno()
public void setDeptno(Integer arg0)
public void setDname(String arg0)
public String getLoc()
public void setLoc(String arg0)
public void showError() throws NumberFormatException
} Process finished with exit code 0
Java利用反射取得类的所有信息的更多相关文章
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- java利用反射访问类的私有(private)属性及方法
Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
- JAVA 利用反射自定义数据层框架
之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...
- Java利用反射排序
前言 Java为我们提供了几种排序得方法,比如Arrays和Collections类,但是前提是数组或者集合中的元素都必须实现Comparable接口,基本的数据类型都已经实现了Comparable接 ...
随机推荐
- js事件处理
1.js中常用的事件处理程序(event Handler) onabort 用户终止了页面的加载 onblur 用户离开了对象 onchange 用户修改了对象 onclick 用户点击了对象 one ...
- nginx 场景业务汇总 (中)
本文链接:http://www.cnblogs.com/zhenghongxin/p/8906225.html,如果可以,请阅读上篇 <nginx场景业务汇总(初)> (十三)负载均衡 轮 ...
- MongoDB 安装详细教程 + 常用命令 + 与 Python 的交互
MongoDB 简介 MongoDB (名称来自 humongous/巨大无比的, 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨 ...
- rawt
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- webpack快速入门——CSS文件打包
1.在src下新建css文件,在css文件下新建index.css文件,输入以下代码 body{ background:pink; color:yellowgreen; } 2.css建立好后,需要引 ...
- Django中指定生成表名的方法
在模型类中定义元类: class Meta: de_table = 'tableName' #指定表名
- easyUI combobox下拉框很长,easyUI combobox下拉框如何显示滚动条的解决方法
如下图,combobox下拉框里内容很多时,会导致下拉框很长,很不美观. 如何使得combobox下拉框显示滚动条 方法:把属性panelHeight:"auto"注释掉即可. $ ...
- Linux终端复用工具 tmux
简介 Terminal Multiplexer (From WIKIPEDIA) - A terminal multiplexer is a software application that can ...
- Qt: QTimer和QThread
让QTimer 跑在其他线程. 一般写法如下. 1. 在main thread中为worker thread指定定时器. QThread* thread = new QThread(this); th ...
- Linux的shell script
Linux的shell script //编辑shell: vi a.sh //子进程运行shell sh a.sh //主线程运行shell source a.sh 相关例子: #!/bin/bas ...