五、反射:
1、ava的反射机制主要表现为四点:
1)在运行中分析类的能力;
2)在运行中查看对象;
3)实现数组的操作代码;
4)利用Method对象,这个对象很像C++中的函数指针。
注:Java的基于反射的应用主要用于一些工具类库的开发,在实际的应用程序开发中应用的场景较少。
2、获取对象的名称(字符串形式) vs 通过对象的名称(字符串形式)创建对象实例,见如下代码:
1publicstaticvoidmain(String args[]) { 2//1. 通过对象获取其字符串表示的名称 3Date d=newDate(); //or Class<? extends Date> c1 = d.class; 4Class<?extendsDate>c1=d.getClass(); 5String className=c1.getName(); 6 7//2. 通过字符串形式的名称创建类实例。 8className="java.util."+className; 9try{ 10Class c2=Class.forName(className); 11//这里用到的newInstance用于创建c2所表示的对象实例,但是必须要求待创建的类实例 12//具有缺省构造函数(无参数),很明显newInstance调用并未传入任何参数用于构造对象。 13Date d2=(Date)c2.newInstance(); 14}catch(ClassNotFoundException e) { 15e.printStackTrace(); 16}catch(InstantiationException e) { 17e.printStackTrace(); 18}catch(IllegalAccessException e) { 19e.printStackTrace(); 20} 21} |
如果需要通过调用带有参数的构造函数来创建对象实例,需要使用java.lang.reflect.Constructor对象来完成,见如下代码:
1publicstaticvoidmain(String args[]) { 2String className="java.util.Date"; 3try{ 4Class c2=Class.forName(className); 5//找到只接受一个long类型参数的构造器 6Constructor cc=c2.getConstructor(long.class); 7longll=45L; 8//将该Constructor期望的指定类型(long)的参数实例传入并构造Date对象。 9Date dd=(Date)cc.newInstance(ll); 10System.out.println("Date.toString ="+dd); 11}catch(Exception e) { 12e.printStackTrace(); 13} 14} |
3、遍历一个未知类型的所有域、构造方法和域方法,见如下函数原型:
Field[] getFields(); 返回指定对象域字段数组,主要包含该类及其超类的所有公有(public)域。
Field[] getDeclaredFields();返回指定对象域字段数组,主要包含该类自身的所有域,包括private等。
Method[] getMethods(); 返回指定对象域方法数组,主要包含该类及其超类的所有公有(public)域方法。
Method[] getDeclaredMethods();返回指定对象域方法数组,主要包含该类自身的所有域方法,包括private等。