Java学习之反射机制

Nyako ·
更新时间:2024-11-14
· 894 次阅读

  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中的重要知识。



反射 JAVA java学习 java学 反射机制

需要 登录 后方可回复, 如果你还没有账号请 注册新账号