java学习之反射机制
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"});
获得类的对象实例后就可以操作对象的方法和属性了。以下是一个例子
1 package reflection; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 5 6 public class TestClass { 7 8 public int add(int a,int b) 9 { 10 return a+b; 11 } 12 13 public String echo(String str) 14 { 15 return str; 16 } 17 18 public static void main(String[] args) throws Exception { 19 Class<?> classType = TestClass.class;//获得Class 20 21 Object Test = classType.newInstance();//通过classType获得对象实例 22 23 Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});//运行中获得add方法 24 25 Object result = addMethod.invoke(Test, new Object[]{1,2});//传入参数调用add方法 26 27 System.out.println((Integer)result); 28 29 Method echoMethod = classType.getMethod("echo",new Class[]{String.class}); 30 31 Object result2 = echoMethod.invoke(Test, new Object[]{"http://www.cnblogs.com/zhi-hao/"}); 32 33 System.out.println(result2); 34 35 } 36 37 }
运行结果:
java反射甚至可以通过压制java的访问控制,改变私有的成员变量。
java学习中反射机制跟动态代理相关,动态代理也是java中的重要知识。
由于水平有限,文章中难免有错误的地方,欢迎指出错误或不足之处,共同进步。欢迎转载,转载时请注明出处,谢谢。
——by CIACs