java的反射

反射是指可以在运行中获取类信息的能力。在java中,利用反射可以运行时获取类的结构信息,查看类实例的域值,动态调用类的方法,动态生成类实例。

这里对常用的反射的几个类进行练习。首先是Class这个类,根据这个类,可以获取成员,包括方法、变量、构造函数。如getFields()可以获取共有变量。而getDeclaredFields()可以获取所有声明的成员变量。Field表示类中的某个域,通过get方法可以获取某个实例的该域值。Method表示方法,通过invoke方法可以调用该方法。

以下代码是一个可以分析自身成员的类。在showClass()中会打印出各个成员的名称。对于变量,还会打印值。对于方法,如果是无参的,则会进行调用执行。

import java.lang.reflect.*;

public class ReflectTest{
	private int intField;
	private String strField;
	public static final int finalFiled=3;
	public ReflectTest(){
		System.out.println("default constructor!");
	}
	private ReflectTest(int n){ 
		System.out.println("another constructor:"+n);
	}
	public void run(){
		System.out.println("run...");
	}
	public void showClass(Class<?>clazz){
		System.out.println("class name:"+clazz.getName());
		try{
			Object obj=clazz.newInstance();
		
			Field[]fields=clazz.getFields();
			System.out.println("getFields()=>");
			for(Field f:fields){
			  System.out.println(f+"="+f.get(obj));
			}
			System.out.println("getDeclaredFields()=>");
			fields=clazz.getDeclaredFields();
			for(Field f:fields){
			  System.out.println(f+"="+f.get(obj));
			}
			System.out.println("getDeclaredConstructors()=>");
			Constructor<?>[]cons=clazz.getDeclaredConstructors();
			for(Constructor<?>c:cons){
			  System.out.println(c);
			}
			Method[]me=clazz.getDeclaredMethods();
			System.out.println("getDeclaredMethods()=>");
			for(Method m:me){
			  System.out.println(m);
			  Class<?>[]parameter=m.getParameterTypes();
			  if(parameter==null||parameter.length==0)
			  	m.invoke(obj);
			}
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
		
	}
	public static void main(String[]args){
		new ReflectTest().showClass(ReflectTest.class);
	}
}

以下是执行的结果。

default constructor!
class name:ReflectTest
default constructor!
getFields()=>
public static final int ReflectTest.finalFiled=3
getDeclaredFields()=>
private int ReflectTest.intField=0
private java.lang.String ReflectTest.strField=null
public static final int ReflectTest.finalFiled=3
getDeclaredConstructors()=>
private ReflectTest(int)
public ReflectTest()
getDeclaredMethods()=>
public void ReflectTest.showClass(java.lang.Class)
public static void ReflectTest.main(java.lang.String[])
public void ReflectTest.run()
run...


这里用的例子比较简单。但是以此可以写一个解析任意类结构的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值