java语言区别于C,C++等准静态语言的大特点是java的反射机制。静态语言的直接定义是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,Java不是动态语言。虽然在这样的定义下java不是动态语言,但java的反射机制(Reflection)却是可实现动态的相关机制。java反射机制的作用有 1、在运行时判断任意一个类所具有的成员变量和方法 2、在运行时构造任意一个类的对象 3、在运行时判断任意一个对象所属的类 4、在运行时调用任意一个对象的方法 在java的jdk中,有java.lang.reflect包,在该包中有5个比较重要的类, 1、Class类:代表一个类。 2、Constructor类:表示类的构造方法,通过该类来操作构造方法 3、Field类:代表类的成员变量(属性)。 4、Method类:代表类的方法。通过该类可操作方法。 5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。 Class 类十分特殊。它和一般类一样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。Class并没有构造方法,不能人为生成。 要想使用java的反射,首先要获得类的Class,而获得的方法有以下几种 String str = "CIACs"; 1、Class c1 = str.getClass(); 2、Class c2 = Class.forName("java.lang.String");//调用Class的静态方法 3、Class c3 = String.class;//每个包装类都有自身的class 获得Class后,可以生成对象了,对象的构造方法有带参数的和不带参数的,当通过不带参数的构造方法来生成对象时有以下两种方式 1、通过newInstance()方法生成 Class<?> classType = str.getClass(); Object obj = classType.newInstance(); 2、通过构造方法实现 Class<?> classType = str.getClass(); Constructor con = classType.getConstructor(new Class[]{}); Object obj = con.newInstance(new Object[]{}); 若要通过带参数的构造方法生成对象实例,只能使用如下方法 Class<?> classType = str.getClass(); Constructor con = classType.getConstructor(new Class[]{String.class}); Object obj = con.newInstance(new Object[]{"CIACs"});获得类的对象实例后可以操作对象的方法和属性了。以下是一个例子 1packagereflection; 2 3importjava.lang.reflect.InvocationTargetException; 4importjava.lang.reflect.Method; 5 6publicclassTestClass{ 7 8publicintadd(inta,intb) 9{ 10returna+b; 11} 12 13publicStringecho(Stringstr) 14{ 15returnstr; 16} 17 18publicstaticvoidmain(String[]args)throwsException{ 19Class<?>classType=TestClass.class;//获得Class 20 21ObjectTest=classType.newInstance();//通过classType获得对象实例 22 23MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//运行中获得add方法 24 25Objectresult=addMethod.invoke(Test,newObject[]{1,2});//传入参数调用add方法 26 27System.out.println((Integer)result); 28 29MethodechoMethod=classType.getMethod("echo",newClass[]{String.class}); 30 31Objectresult2=echoMethod.invoke(Test,newObject[]{"http://www.cnblogs.com/zhi-hao/"}); 32 33System.out.println(result2); 34 35} 36 37} 运行结果:
java学习中反射机制跟动态代理相关,动态代理也是java中的重要知识。