反射的应用(1)---获取类中各成分的信息

1.通过反射获取有关构造器的信息

常用的方法:getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此Class 对象所表示的类的所有公共构造方法。

getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法

getModifiers() 整数形式 回此 Constructor 对象所表示构造方法的 Java 语言修饰符。

getName() 以字符串形式返回此构造方法的名称。

getParameterTypes() 照声明顺序返回一组 Class 对象,这些对象表示此Constructor 对象所表示构造方法的形参类型

toString() 返回描述此 Constructor 的字符串

newInstance(Object... initargs) 用此Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

示例如下:

先建一个person

 

interface China{
	public static final String NATIONAL = "China" ;	// 定义全局常量
	public static final String AUTHOR = "温家宝" ;	// 定义全局常量
	public void sayChina() ;		// 无参的,没有返回值的方法
	public String sayHello(String name,int age) ;	// 定义有两个参数的方法,并返回内容
}
public class Person implements China{
	private String name;
	private int age;
	public Person(){}
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}

	public void sayChina() {
		System.out.println("作者:" + AUTHOR + ",国籍:" + NATIONAL) ;
	}

	public String sayHello(String name, int age) {	
		 return name + ",你好!我今年:" + age + "岁了!" ;
	}
}


然后通过反射获取Person类中的构造器的信息,代码如下:

 

public class GetConstructor {
	public static void main(String []args){
		Class<?> c1=null;//声明Class对象
		try {
			c1=Class.forName("reflect.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Constructor<?>[] constructors=c1.getConstructors();//获得一个类中所有的构造函数
		for(int i=0;i<constructors.length;i++){
			Class<?> pClass[]=constructors[i].getParameterTypes();//获取参数类型
			System.out.println("构造方法:");
			int mod = constructors[i].getModifiers();//返回修饰符所对应的整数值
			System.out.print(Modifier.toString(mod));//获得修饰符
			System.out.print(constructors[i].getName());//获得构造方法的名字
			System.out.print("(");
			for(int j=0;j<pClass.length;j++){
				System.out.print(pClass[j].getName()+" .args"+j);
				if(j<pClass.length-1){ // 判断此是否是最后一个参数
					System.out.print(",");
				}
			}
			System.out.println("){}") ;
		}
	}
}

输出结果为:构造方法:publicreflect.Person(java.lang.String .args0,int .args1){}
                      构造方法:publicreflect.Person(){}

2.通过反射获取类中的方法信息   

常用的方法:getName()           以 String 形式返回此Method 对象表示的方法名称   

getReturnType()           返回一个 Class 对象,该对象描述了此Method 对象所表示的方法的正式返回类型   

getParameterTypes()           按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型 

getModifiers()            以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符   

getExceptionTypes()           返回 Class 对象的数组,这些对象描述了声明将此Method 对象表示的底层方法抛出的异常类型   

toString()           返回描述此 Method 的字符串   

getDeclaredMethods()           返回 Method 对象的一个数组,这些对象反映此Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法   。

getMethods()         返回一个包含某些 Method 对象的数组,这些对象反映此Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。

仍然用上面的Person类,通过反射获取上面的Person类中的方法信息,代码如下:

 

public class GetMethod {

	public static void main(String[] args) {
		Class<?> c1=null;
		try {
			c1=Class.forName("reflect.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Method m[]=c1.getMethods();//获得所有的方法
		for (int i = 0; i < m.length; i++) {
			Class<?> r = m[i].getReturnType();//获得方法的返回值类型
			Class<?>[] p = m[i].getParameterTypes();//获得全部参数的类型
			int mod=m[i].getModifiers();//返回权限修饰符对应的整型数
			System.out.print(Modifier.toString(mod));//输出修饰符
			System.out.print(" "+r+" ");
			System.out.print(m[i].getName());//输出方法名
			System.out.print("(");
			for (int j = 0; j < p.length; j++) {
				System.out.print(p[j].getName()+" args"+j);
				if (j<p.length-1) {
					System.out.print(",");
				}
			Class<?>[] ex=m[i].getExceptionTypes();
			if (ex.length>0) {
				System.out.print(")throws");
			}else {
				System.out.print(")");
			}
			for (int k = 0; k < ex.length; k++) {
				System.out.print(ex[k].getName());
				if (k<ex.length-1) {
					System.out.print(",");
				}
			}
			System.out.println();
			}
		}
	}
}

 

3.通过反射获取类中属性的信息

  常用方法:getFields()           返回一个包含某些 Field 对象的数组,这些对象反映此Class 对象所表示的类或接口的所有可访问公共字段。

                   getField(String name)           返回一个Field 对象,它反映此Class 对象所表示的类或接口的指定公共成员字段。

                   getDeclaredFields()           返回Field 对象的一个数组,这些对象反映此Class 对象所表示的类或接口所声明的所有字段。

                   getDeclaredField(String name)           返回一个Field 对象,该对象反映此Class 对象所表示的类或接口的指定已声明字段。

                  getModifiers()           以整数形式返回此Method 对象所表示方法的 Java 语言修饰符。

                  getName()            以 String 形式返回此 Method 对象表示的方法名称。

                  getParameterTypes()           按照声明顺序返回Class 对象的数组,这些对象描述了此Method 对象所表示的方法的形参类型。

                  getReturnType()           返回一个Class 对象,该对象描述了此Method 对象所表示的方法的正式返回类型。

                 toString()               返回描述此Method 的字符串.

通过反射获取Person类中的属性信息,代码如下:

 

public class GetMethod {

	public static void main(String[] args) {
		Class<?> c1=null;
		try {
			c1=Class.forName("reflect.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Method m[]=c1.getMethods();//获得所有的方法
		for (int i = 0; i < m.length; i++) {
			Class<?> r = m[i].getReturnType();//获得方法的返回值类型
			Class<?>[] p = m[i].getParameterTypes();//获得全部参数的类型
			int mod=m[i].getModifiers();//返回权限修饰符对应的整型数
			System.out.print(Modifier.toString(mod));//输出修饰符
			System.out.print(" "+r+" ");
			System.out.print(m[i].getName());//输出方法名
			System.out.print("(");
			for (int j = 0; j < p.length; j++) {
				System.out.print(p[j].getName()+" args"+j);
				if (j<p.length-1) {
					System.out.print(",");
				}
			Class<?>[] ex=m[i].getExceptionTypes();
			if (ex.length>0) {
				System.out.print(")throws");
			}else {
				System.out.print(")");
			}
			for (int k = 0; k < ex.length; k++) {
				System.out.print(ex[k].getName());
				if (k<ex.length-1) {
					System.out.print(",");
				}
			}
			System.out.println();
			}
		}
	}
}

输出结果为:

本类属性权限:private java.lang.String  name;
本类属性权限:private int  age;
公共属性:public static final java.lang.String NATIONAL ;
公共属性:public static final java.lang.String AUTHOR ;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值