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利用反射取得类的所有信息的更多相关文章

  1. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  2. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  3. java利用反射访问类的私有(private)属性及方法

    Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...

  4. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  5. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  6. java反射-使用反射获取类的所有信息

    在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...

  7. java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问

    在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...

  8. JAVA 利用反射自定义数据层框架

    之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...

  9. Java利用反射排序

    前言 Java为我们提供了几种排序得方法,比如Arrays和Collections类,但是前提是数组或者集合中的元素都必须实现Comparable接口,基本的数据类型都已经实现了Comparable接 ...

随机推荐

  1. 知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)

    本文由  网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学” ...

  2. IT和非IT人士:2分钟了解什么是区块链

    本文由  网易云发布. (非IT:阅读常规部分:IT:阅读引用块) 作者:任长存,网易杭州研究院工程师 前言 信息的高速发展,致使互联网风口犹如娱乐圈,移动互联网,微博.直播.共享经济.短视频.小程序 ...

  3. Console命令,让js调试更简单

    一.显示信息的命令 console.log("normal"); // 用于输出普通信息 console.info("information"); // 用于输 ...

  4. 关于rpm的命令

    我是从这里学的:https://www.cnblogs.com/picaso/archive/2012/07/02/2573748.html 软件的安装时操作系统管理的基础,与Windows不同,Li ...

  5. css四种选择器总结

    css 在网页开发中扮演着重要的角色,被誉为网页开发的三剑客,如果说html是人的外在器官部分,那css无疑是各个器官组成在一起然后表现出来,css又称样式重叠在网页排版布局中的地位举足轻重.   做 ...

  6. 扩展中国剩余定理(扩展CRT)详解

    今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...

  7. J07-Java IO流总结七 《 InputStreamReader和OutputStreamWriter 》

    前面在介绍FileReader和FileWriter的时候有说到,FileReader的读取字符功能,以及FileWriter的写出字符的功能,都不是它们自己实现的,而是,它们分别继承了InputSt ...

  8. c# Xml反序列化示例

    Xml 示例 <?xml version="1.0" encoding="utf-8"?> <CarCollection> <Ca ...

  9. 【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 ...

  10. PreparedStatement插入values

    public interface PreparedStatementextends Statement 表示预编译的 SQL 语句的对象. SQL 语句被预编译并存储在 PreparedStateme ...