编程语言中的各种反射

        在最刚开始接触设计模式的时候,那时候还是用的vb.net,对于反射只是懵懵懂懂,只知道把dll放到指定地方,就可以通过Assembly加载并获取里面的类。对于那个阶段的反射,只是停留在了类的层次。

        后来,学习了JavaScript,这门脚本语言,是弱类型、基于面向对象的(到现在依然还是懵懵懂懂)。这个里面的反射,确切的说,JavaScript没有完整的反射体系。但是在编码中可以通过代码设计来完成类似反射的基本功能。还是比较简单的吧。

        再后来,就是现在了,接触了Java的反射。可以说真正接触反射,就是从这里开始的。

        说到底,反射到底是什么?我们来看看百度百科怎么说:程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。Java不是动态语言,但Java有非常突出的动态相关机制,可以加载一个运行时才知名称的class,获悉其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。

        而对fields、methods的使用可以遍历,可以通过字符串进行指定,这也就使得不同类,可以调用相同的方法。例如:我现在有一个方法,接收一个Object类型的参数,我确定传进来的Object都会有一个Id的属性,我要获取这个属性,并对其进一步操作。

        现在该怎么办?在学了今天这篇博文后,你可以用commons-beanutils.jar包里面的BeanUtils和PropertyUtils工具类。

        这个方法,只能获取到指定类自身内部的属性,对于父类里面的属性,是获取不到的

public Object getFieldValue(Object object, String propertyName)  
		throws IllegalAccessException, NoSuchFieldException {
	//获取Object的指定property
	Field field = object.getClass().getDeclaredField(propertyName);  
	//设置其可见性,若不设置,则无法获取其值,如果获取的属性为public,则可以不加这句
	field.setAccessible(true);  

	return field.get(object);  
}  
        更多的时候,如果说传入的Object都会有,那么我们一般考虑将其抽象到父类里,那么上面的方法就不适合了。下面这个方法,可以获取自身及父类里面的所有属性,思路其实很简单,就是在当前类里面获取该字段,如果没有,就去其父类里面获取:

public Object getFieldValueInAllSuper(Object object, String propertyName)  
            throws IllegalAccessException, NoSuchFieldException {
	//获取当前Object的class
	Class claszz=object.getClass();  
	Field field = null;  	  
	do{     
		try{  //从类里面获取指定属性
			field = claszz.getDeclaredField(propertyName);  
		}  
		catch(NoSuchFieldException e){//如果没有获取到,则设置为null
			field=null;  
		}
		//设置当前class为父class
		claszz=claszz.getSuperclass();  
	} while(field==null&&claszz!=null); //当field为空且class不为空时,进行下次循环
	
	//如果field为空,说明没有此字段,返回空
	if(field==null) return null;  
	//如果不为空,设置可见性,然后返回
	field.setAccessible(true);  
	return field.get(object);  
}


        属性反射完了,那么现在来看一下方法应该怎样动态调用呢?我只列一个不带参数的方法调用,需要传参数的同学自己研究一下~~

private String getId(Object o) throws IllegalArgumentException, SecurityException,
			IllegalAccessException, InvocationTargetException, NoSuchMethodException {
	//从当前类及父类中找
	return (String) o.getClass().getMethod("getId").invoke(o);
	//只查找当前类
	return (String)o.getClass().getDeclaredMethod("getId").invoke(o);
}

        属性、方法反射完了,那么应该怎样去动态的加载一个类呢?这里就只提一下:用Class.forName()。其实我感觉这里用的比较多的是传入接口类型,然后获取接口的class当作参数。

        最近这些日子,对于泛型、反射用的比以前多了很多,也体会到了它们的用处。最近的博客,应该都会和这些有关,因为封装,如果离了这两个,真心感觉那将是恶梦~~

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
C#语言反射方法泛型是指使用反射机制来获取和操作泛型类型和泛型方法。泛型类型和泛型方法是C#语言的重要概念,它们可以为开发者提供更加灵活和通用的编程方式。 反射机制是指在程序运行时动态地获取和操作程序的类型信息。通过反射机制,我们可以获取类型的属性、方法、事件等信息,并且可以动态地创建对象、调用方法、设置属性等操作。 在C#语言,我们可以使用反射机制来获取泛型类型和泛型方法的信息。例如,我们可以使用以下代码来获取一个泛型类型的信息: Type genericType = typeof(List<>); 在上面的代码,我们使用typeof关键字和<>符号来获取一个泛型类型List<>的信息。通过这个Type对象,我们可以获取这个泛型类型的各种信息,例如它的名称、命名空间、基类型、泛型参数等等。 除了获取泛型类型的信息之外,我们还可以使用反射机制来获取泛型方法的信息。例如,我们可以使用以下代码来获取一个泛型方法的信息: MethodInfo genericMethod = typeof(List<>).GetMethod("Add"); 在上面的代码,我们使用GetMethod方法来获取List<>类型的Add方法的信息。通过这个MethodInfo对象,我们可以获取这个泛型方法的各种信息,例如它的名称、返回类型、参数列表、泛型参数等等。 总的来说,C#语言反射方法泛型是一个非常强大和灵活的编程方式。通过反射机制,我们可以动态地获取和操作程序的类型信息,从而实现更加通用和灵活的编程方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值