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接 ...
随机推荐
- sql表与表之间的数据操作
--把一张表的内容更新到另一张表 update 表1 set 表1.Store=t2.Name from 表2 t2 where 表1.id=t2.id --备份一张表 create table ta ...
- [翻译].NET Core 3 Preview1和Windows桌面框架开源
原文来自TechViews 今天,我们宣布推出.NET Core 3 Preview 1.这是.NET Core 3的第一个公开发布.我们有一些令人兴奋的新功能可供分享,并希望得到您的反馈.您可以使用 ...
- leetcode 75. 颜色分类 JAVA
题目: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和 ...
- docker 运行容器,安装Nginx
########################################## #运行容器 #安装Nginx #搜索.下载镜像 docker search nginx docker pull n ...
- Dynamic Type
啥是 Dynamic Type 动态字体,即视力不好的用户,调整了默认字体的大小,开发者应该根据这个设置,动态改变界面的字体等,保证用户能看得清楚. 这个还是蛮重要的,视力不好的人越来越多. 用户在哪 ...
- 把本地git仓库的项目上传到远程仓库
之前在学校实验室服务器上建了一个git远程仓库,存放我写的express项目代码.后来由于出去实习,就无法访问那个远程仓库了,因为它在校园网内. 还好我的笔记本中有这个项目完整的本地仓库,于是我就试着 ...
- Go语言学习笔记(3)——分支、循环结构
1 条件语句: if, else if, else 特殊用法:判断num是奇是偶:其中局部变量num只能在该if...else语句中使用! if num := 10; num % 2 == 0 { ...
- 【xsy1378】 水题7号 贪心
题目大意:有$m$组约束关系$(x_i,y_i)$,你要构造一个排列,满足数$x_i$出现在数$y_i$前面,请使得这个排列字典序最小,请输出这个排列.无解请输出-1. 数据范围:$n,m≤10^5$ ...
- Shell之expect的测试
测试:./sshLogin.sh Slave1 caipeichao 1qaz@WSX hadoop lk198981 HadoopCluster #!/usr/bin/expect -f #auto ...
- 【DB2】How to resolve SQL20249N the statement was not processed with error
相关链接 https://vinaysdb2blog.blogspot.com/2017/11/how-to-resolve-sql20249n-statement-was-not-processed ...