天天看点

Java反射机制(二):通过反射取得类的结构

在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类:

· constructor  表示类中的构造方法

· field  表示类中的属性

· method 表示类中的方法

接下来,我们讲讲,如何通过这些api,去获取一个类的完整性结构。

首先,我们定义一个类:

一、 通过反射取得类所实现的全部接口

Java反射机制(二):通过反射取得类的结构

输出: 实现的接口名称:com.chen.yuan.vo.china

二、 取得类所继承的父类

Java反射机制(二):通过反射取得类的结构

输出: 父类名称:java.lang.object

三、取得类中的全部构造方法

输出:

构造方法:public com.chen.yuan.vo.person(java.lang.string,int)

构造方法:public com.chen.yuan.vo.person(java.lang.string)

构造方法:public com.chen.yuan.vo.person()

以上直接打印出构造方法,调用的是constructor类中 的tostring()方法。

constructor类中存在了一下几个几个方法:

· public int getmodifiers()取得修饰符

· public string getname()取得方法名称

· public class<?>[] getparametertypes()取得参数的类型

构造方法:1 com.chen.yuan.vo.person(java.lang.string arg0,int arg0){}

构造方法:1 com.chen.yuan.vo.person(java.lang.string arg1){}

构造方法:1 com.chen.yuan.vo.person(){}

观察输出,我们发现,所有的修饰符变成了数字,我们肯定不懂这些个数字是什么意思,那么接下来,让我们还原修饰符。此时,我们需要借助modifier类完成,此类定义在java.lang.reflect包中,我们可以直接使用modifier类中的tostring(int mod)方法完成还原修饰符的操作。

先看一下modifier类中的tostring(int mod)方法的源码:

通过源码,我们应当很容易的发现,在modifier类中的tostring(int mod)方法中,我们进行了转换的操作。

构造方法:public com.chen.yuan.vo.person(java.lang.string arg0,int arg0){}

构造方法:public com.chen.yuan.vo.person(java.lang.string arg1){}

构造方法:public com.chen.yuan.vo.person(){}

四、 取得全部方法

要想取得一个类中的全部方法,可以通过class类中的getdeclaredmethods()方法,此方法返回一个method类的对象数组,然后我们可以通过method类,去进一步得到方法的详细信息。

输出;

public class java.lang.string getname()

public void setname(java.lang.string arg0)

public void saychina()

public class java.lang.string sayhello(java.lang.string arg0,int arg1)

public void setage(int arg0)

public int getage()

public final void wait(long arg0,int arg1) throws java.lang.interruptedexception,

public final native void wait(long arg0) throws java.lang.interruptedexception

public final void wait() throws java.lang.interruptedexception

public boolean equals(java.lang.object arg0)

public class java.lang.string tostring()

public native int hashcode()

public final native class java.lang.class getclass()

public final native void notify()

public final native void notifyall()

五、 取得类中的属性

class类中提供了两种不同的操作,可以获得field:

1) 得到实现的接口或父类中的公共属性: public field[] getfields() throws securityexception

2) 得到本类中的全部属性: public field[] getdeclaredfields() throws securityexception

输出:

本类属性:private java.lang.string name ;

本类属性:private int age ;

公共属性:public static final java.lang.string national ;

公共属性:public static final java.lang.string author ;