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接 ...
随机推荐
- JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM ...
- 理解DDoS防护本质:基于资源较量和规则过滤的智能化系统
本文由 网易云发布. 随着互联网生态逐渐形成,DDoS防护已经成为互联网企业的刚需要求,网易云安全(易盾)工程师根据DDoS的方方面面,全面总结DDoS的攻防对抗. 1.什么是DDoS DDoS全称 ...
- Codeforces Round #427 (Div. 2) B. The number on the board
引子: A题过于简单导致不敢提交,拖拖拉拉10多分钟还是决定交,太冲动交错了CE一发,我就知道又要错过一次涨分的机会.... B题还是过了,根据题意目测数组大小开1e5,居然蒙对,感觉用vector更 ...
- 听补天漏洞审核专家实战讲解XXE漏洞
对于将“挖洞”作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity ...
- ajax请求失败 chrome报错net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题原因
项目框架 React.js + webpack + ES6 + JQuery 问题场景 ajax请求用户数据,服务器返回json格式,数据很可能会比较长,甚至达到几百kb. 问题描述 客户端ajax请 ...
- gulp-load-task 解决 gulpfile.js 过大的问题
当我们在项目中使用gulp来实现前端自动化时,常常因任务太多导致gulpfile.js越来越臃肿,增加后期维护/变更成本.在计算机科学领域中,分治可以将我们的项目变得井然有序.所以,我们利用这个理念, ...
- 网络请求 爬虫学习笔记 一 requsets 模块的使用 get请求和post请求初识别,代理,session 和ssl证书
前情提要: 为了养家糊口,为了爱与正义,为了世界和平, 从新学习一个爬虫技术,做一个爬虫学习博客记录 学习内容来自各大网站,网课,博客. 如果觉得食用不良,你来打我啊 requsets 个人觉得系统自 ...
- Ubuntu 连接手机 不识别设备 -- 解决办法
1.usb线连接手机,输入命令 $ lsusb Bus 004 Device 002: ID 8087:8000 Intel Corp. Bus 004 Device 001: ID 1d6b:000 ...
- Java枚举源码分析
1.是一个范型类, 实现了Serializable和Comparable接口 2.只有两个成员变量:name.ordinal 3.枚举类隐含一个values函数,需通过反射调用才可获取枚举实例化对象列 ...
- Google Maps-IP地址的可视化查询
转自:http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000004203 第3章 实战Google Maps API之一——IP地 ...