关闭

Java和C++在细节上的差异(三)

发表于:2011-8-11 09:53

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Stephen_Liu    来源:51Testing软件测试网采编

  接Java和C++在细节上的差异(二)

  五、反射:

  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等。

61/6123456>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号