关于Java的反射机制和工厂模式的代码理解

lwcxgt601184 2016-05-25 03:23:15
package com.jq.server.service;

import java.lang.reflect.Constructor;

import com.jq.server.service.Service;

/**
* 获取对应服务的服务工厂的代码.
*
* [服务器核心类.] 用于返回处理各种客户端要求执行的操作.
*
* */

public class ServiceFactory {

/** 登陆 LoginService */
public static final String TASK_LOGIN = "0";
/** 注销 LogoutService */
public static final String TASK_LOGOUT = "1";
/** 新用户注册 RegisterService */
public static final String TASK_NEWUSER = "2";
/** 更新用户资料 UpdateInfoService */
public static final String TASK_UPDATAINFO = "3";
/** 查看好友资料 FriendInfoService */
public static final String TASK_GETINFO = "4";
/** 搜索好友 SearchService */
public static final String TASK_SEARCH = "5";
/** 添加好友 AddtionService */
public static final String TASK_ADDTION = "6";
/** 删除好友 RemoveFriendService */
public static final String TASK_REMOVE = "7";
/** 离线消息 LeftInfoService */
public static final String TASK_LEFTINFO = "8";
/** 获取更改密码 PasswordService */
public static final String TASK_PASSWORD = "9";
/** 成功标示符 */
public static final String SUCCESS = "SUCCESS";
/** 失败标示符 */
public static final String ERROR = "ERROR";
/** 用户已登录标示符 */
public static final String LOGINED = "9";

private static final String[] TYPE = { "com.jq.server.service.LoginService",
"com.jq.server.service.LogoutService",
"com.jq.server.service.RegisterService",
"com.jq.server.service.UpdateInfoService",
"com.jq.server.service.FriendInfoService",
"com.jq.server.service.SearchService",
"com.jq.server.service.AddtionService",
"com.jq.server.service.RemoveFriendService",
"com.jq.server.service.LeftInfoService",
"com.jq.server.service.PasswordService" };

/** 利用反射使用指定带参构造方法创建指定名称类的对象
* @return Service */
public static Service getService(String msg) {
/* 解析--->消息类型 */
int type = Integer.parseInt(msg.substring(0, 1));
/* 解析--->ID_信息体 */
msg = msg.substring(1);
/* 使用反射机制加载相关类 */
String className = TYPE[type];
Class<?> c;
@SuppressWarnings("rawtypes")
Constructor constructor;
try {
//加载指定名称的类,获取相应的Class对象
c = Class.forName(className);
//获取具有指定参数类型的构造方法
constructor = c.getConstructor(String.class);// String.class 的类型是
// Class<String>
//给指定的构造方法传入参数值,创建出一个对象
Service s = (Service) constructor.newInstance(msg);
return s;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}

上面的代码中能不能为我解释一下getService方法的含义
...全文
141 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
holzkoepfer 2016-05-25
  • 打赏
  • 举报
回复
举例 调用 getService(3) int type = Integer.parseInt(msg.substring(0, 1)); type = 3 msg = msg.substring(1); msg = 3 /* 使用反射机制加载相关类 */ String className = TYPE[type]; className = TYPE[3] = "com.jq.server.service.UpdateInfoService" Class<?> c; 不解释 @SuppressWarnings("rawtypes") Constructor constructor; 不解释 try { //加载指定名称的类,获取相应的Class对象 c = Class.forName(className); c = com.jq.server.service.UpdateInfoService这个类 //获取具有指定参数类型的构造方法 constructor = c.getConstructor(String.class);// String.class 的类型是 constructor 获得 "com.jq.server.service.UpdateInfoService"类的带一个String类型参数的构造函数 相当于 constructor 就是 updateInfoService(String para), // Class<String> //给指定的构造方法传入参数值,创建出一个对象 Service s = (Service) constructor.newInstance(msg); 等于调用 Service s = new updateInfoService(msg)返回类型为 Service return s; 不解释 } catch (Exception e) { e.printStackTrace(); return null; } }
Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第1页。 3.1 应用场景 在一些开源框架里,如Spring,Struts,Hibernate,MyBatis等,应用程序会提供一个配置文件如xml文件或者properties,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面不一定能直接调用另外的方法,这时候也可以通过反射机制来实现。 应用程序通过读取配置文件来获取到指定名称的类的字节码文件并加载其中的内容进行调用,对一个类文件进行解剖,就可以取得任意一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第2页。 3.2 相关知识 3.2.1 Java反射机制的概念 3.2.2 反射机制的功能 3.2.3 Java反射机制的相关API 3.2.4 使用反射机制的步骤 3.2.5 反射机制的应用场景 3.2.6 反射机制的优缺点 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第3页。 3.2.1 Java反射机制的概念 Java反射机制Java运行状态中,对于任意一个类,我们都能够知道这个类的所有属性和方法;, 对于任意一个对象,我们都能够调用它的任意一个方法;。 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第4页。 3.2.2 反射机制的功能 反射机制的功能如下: 在运行时判定任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判定任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理;。 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第5页。 3.2.3 Java反射机制的相关API java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口。反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问。它允许在安全限制内使用反射的字段,方法和构造函数对其底层对等进行操作。 java.lang.Class; //类 java.lang.reflect.Constructor;//构造方法 java.lang.reflect.Field; //类的成员变量 java.lang.reflect.Method;//类的方法 java.lang.reflect.Modifier;//访问权限 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第6页。 3.2.4 使用反射机制的步骤 导入Jjava.lang.relfect 包需 遵循以下3三个步骤: 第一步是获得你想操作的类的 java.lang.Class 对象; 第二步是调用诸如 getDeclaredMethods 的方法; 第三步使用 反射API 来操作这些信息。 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第7页。 3.2.5 反射机制的应用场景 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,常见的应用如下 逆向代码 ,例如反编译 与注解相结合的框架 例如Retrofit 单纯的反射机制应用框架 例如EventBus 2.x 动态生成类框架 例如Gson Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第8页。 3.2.6 反射机制的优缺点 可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象,总结如下。 优点:运行期类型的判断,

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧