java的反射机制-研究

发布时间:2014-10-22 14:02:35编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"java的反射机制-研究",主要涉及到java的反射机制-研究方面的内容,对于java的反射机制-研究感兴趣的同学可以参考一下。

JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义,只是获取!),并生成其对象实体、或对其fields设值、或唤起其methods。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。所以反射的存在意义就是让我们在运行的时候确定这个类(在我写的项目中用到的一个例子是,在dao层的时候,我想定义一个通用的BaseDao,在数据库的查询的时候,需要写上表名select * from table1,这个表名通常是根据我们实体名来命名的,或者在实体类中(table=tabname)来确定的,这个时候我需要在BaseDao中定义一个泛型,然后根据反射技术在运行的时候确定是哪个调用了我这个dao(更甚至得到table=tabname这个名称)),这些的实现就是java反射的最好体现!! Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像对象导向当初被导入编程领域一样,一人一把号,各吹各的调。 一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。 尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。 Java如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个篇幅最主要还是介绍Reflection APIs,也就是让读者知道如何探索class的结构、如何对某个“运行时才获知名称的class”生成一份实体、为其fields设值、调用其methods。本文将谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。   挂两段代码: //以上就可得到参数类型 //调用的话Method.revoke就可以了. public class T {    public void fun(String s){  }    public void fun1(String s ,int i){     }  public static void main(String[] args) throws Exception {   Class c = Class.forName("cn.com.reflect.T");   Method[] ms = c.getDeclaredMethods();   for(int i = 0;i < ms.length;i++){    Method m = ms[i];    Class[] params = m.getParameterTypes();    System.out.println(m.getName() + "方法的参数类型是:");    for(int j = 0;j < params.length;j++){     System.out.println(params[j].getName());    }    System.out.println();   }          } } 或者 package szw.junit; import java.lang.reflect.Method; import junit.framework.Assert; import junit.framework.TestCase; public class TestCalculator2 extends TestCase {  public void testAdd()  {   try   {    Calculator2 cal2 = new Calculator2();        Class clazz = Calculator2.class;    Method method = clazz.getDeclaredMethod("add", new Class[] {      Integer.TYPE, Integer.TYPE });    method.setAccessible(true);    Object result = method.invoke(cal2, new Object[] { 2, 3 });    Assert.assertEquals(5, result);   }   catch (Exception ex)   {    Assert.fail();   }  } }


上一篇:配置Log4j(很详细)
下一篇:RTMP,RTSP,HLS比较

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款