java学习之反射机制

java语言区别于C,C++等准静态语言的最大特色就是java的反射机制。静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,Java不是动态语言。虽然在这样的定义下java不是动态语言,但java的反射机制(Reflection)倒是可实现动态的相关机制。java反射机制的做用有java

一、在运行时判断任意一个类所具备的成员变量和方法python

二、在运行时构造任意一个类的对象数组

三、在运行时判断任意一个对象所属的类ruby

四、在运行时调用任意一个对象的方法ide

在java的jdk中,有java.lang.reflect包,在该包中有5个比较重要的类,学习

一、Class类:表明一个类。spa

二、Constructor类:表示类的构造方法,经过该类来操做构造方法3d

三、Field类:表明类的成员变量(属性)。代理

四、Method类:表明类的方法。经过该类可操做方法。code

五、Array类:提供了动态建立数组,以及访问数组的元素的静态方法。

Class 类十分特殊。它和通常类同样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。Class并无构造方法,不能人为生成。
 
要想使用java的反射,首先要得到类的Class,而得到的方法有如下几种
String str = "CIACs";
一、Class c1 = str.getClass();
二、Class c2 = Class.forName("java.lang.String");//调用Class的静态方法
三、Class c3 = String.class;//每一个包装类都有自身的class
 
得到Class后,就能够生成对象了,对象的构造方法有带参数的和不带参数的,当经过不带参数的构造方法来生成对象时有如下两种方式
一、经过newInstance()方法生成
Class<?> classType = str.getClass();
 Object obj = classType.newInstance();
二、经过构造方法实现
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 }
TestClass

 

运行结果:
 
java反射甚至能够经过压制java的访问控制,改变私有的成员变量。
 
java学习中反射机制跟动态代理相关,动态代理也是java中的重要知识。
相关文章
相关标签/搜索