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. jvm(1)类的加载(二)(自定义类加载器)

    [深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...

  2. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小. >>> abs(-25) 25 >&g ...

  3. LC-BLSTM结构快速解读

    参考文献如下: (1) A Context-Sensitive-Chunk BPTT Approach to Training Deep LSTM/BLSTM Recurrent Neural Net ...

  4. 【GDOI2015】 推箱子 状态压缩+bfs

    请注意$8$是一个美妙的数字 考虑到$8\times 8=64$,而一个unsigned long long是$64$位的,所以考虑用一个$01$状态存储箱子.考虑到箱子能转动,那么四种情况都存一下就 ...

  5. 【NOIP2013】转圈游戏 快速幂

    题目大意:给你四个整数$n,m,k,x$,求$(x+m\times 10^k)%n$. 直接一个快速幂就好了,注意开$long\ long$. #include<bits/stdc++.h> ...

  6. Docker镜像(二)

    一. 获取镜像 1.1. docker pull 镜像是运行容器的前提,也就是说没有镜像就没有办法创建容器 获取镜像的命令: docker pull 这个命令可以直接在docker Hub镜像源下载镜 ...

  7. .Net Core Nuget还原失败

    项目获取后发现所有项目的依赖项全部报黄.. 展开发现所有的Nuget包都没有引用.. 按错误窗口的提示使用解决方案上"Nuget包还原"来解决却没有任何进展.. 错误窗口报文 找不 ...

  8. Scala 中的foreach和map方法比较

    Scala中的集合对象都有foreach和map两个方法.两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法.而两者的差异在于:foreach无返回值(准确说返回void),map返 ...

  9. 关于Oracle中的字符的比较

    1.Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个: 函数来说明: CREATE OR REPLACE FUNCTION MinOrMax(para1 ...

  10. HUE配置文件hue.ini 的hive和beeswax模块详解(图文详解)(分HA集群和非HA集群)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...