Java 覆盖 jar 包内的方法
背景
有时候在 java 开发过程中会遇到这样的场景,比如说我们需要用 jar 包里的方法,但是 jar 包里的方法又不能满足当前的业务逻辑需要,而想直接下载 jar 包源码修改的话又会很麻烦,这个时候比较简便快捷能满足需要的办法就是覆写 jar 包中对应的方法,只需要改动你用的类的某一个方法就行,而不用去下载 jar 包源码再打包那么繁杂。
有一点需要注意的是需要保持方法中的参数不变,同时不能删除原有类的方法,但是可以新增一些方法来实现自己业务逻辑。
java 实现
实现代码其实比较简单,就是创建一个和 jar 包中需要重写类的路径,类名完全一样的类,然后 copy jar 包中原类的全部方法到 jar 包外的类中,根据需要改写原方法的业务逻辑或者新增方法来实现自己需要的业务逻辑,由于 jar 包外代码的优先级高于 maven 依赖 jar 包的优先级,这个时候你重写的类就会生效了。
比如 LoginController.class
重写后 LoginController.java
这里你可以在 jar 包外方法中新增自己的方法实现新的业务逻辑。
重写之后新增方法
整体源代码如下,集成了钉钉扫码登录功能
@Controller
public class LoginController extends BaseController
{@Autowiredprivate DingDingProperties dingDingProperties;@Autowiredprivate ISysUserService sysUserService;@Autowiredprivate IDingDingService dingDingService;@Autowiredprivate PasswordService passwordService;@Autowiredprivate ISysUserDeptService sysUserDeptService;@Autowiredprivate UserRoleMapper userRoleMapper;@GetMapping("/login")public String login(HttpServletRequest request, HttpServletResponse response, ModelMap mmap){// 如果是Ajax请求,返回Json字符串。if (ServletUtils.isAjaxRequest(request)){return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}");}String dingtalkAppId = dingDingProperties.getAppId();//获取请求域名String scheme = request.getScheme();String serverName = request.getServerName();String dingtalkProjectUrl = scheme + "://" + serverName + "/";mmap.put("appId",dingtalkAppId);mmap.put("projectUrl",dingtalkProjectUrl);String msg = request.getParameter("msg");if (msg != null && msg != "") {if ("one".equals(msg)){mmap.put("msg","当前用户不存在,请联系管理员!");}else if ("two".equals(msg)) {mmap.put("msg","您好,请求连接远程服务器失败!");}}return "login";}@PostMapping("/login")@ResponseBodypublic AjaxResult ajaxLogin(String username, String password, Boolean rememberMe){UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);Subject subject = SecurityUtils.getSubject();try{subject.login(token);return success();}catch (AuthenticationException e){String msg = "用户或密码错误";if (StringUtils.isNotEmpty(e.getMessage())){msg = e.getMessage();}return error(msg);}}@GetMapping("/unauth")public String unauth(){return "error/unauth";}/*** 扫码登录并跳转到index* @param request* @return*/@RequestMapping("/loginScan")public String loginSys(HttpServletRequest request){String code = request.getParameter("code");String msg = "";//扫码登录try {OapiSnsGetuserinfoBycodeResponse.UserInfo userInfo = dingDingService.getUserInfoByCode(code);String unionId = userInfo.getUnionid();//String unionId = "dingdingceshiunionid";//根据unionId 获取用户信息SysUser use = sysUserService.selectUserByUnionId(unionId);if (use != null) {return doLoginSystem(use);}else {//未绑定 则自动添加账号 根据unionid获取useridOapiUserGetbyunionidResponse.UserGetByUnionIdResponse userIdByUnionIdV2 = dingDingService.getUserIdByUnionIdV2(unionId);if (userIdByUnionIdV2 != null && StringUtils.isNotEmpty(userIdByUnionIdV2.getUserid())) {//根据userid获取用户详细信息OapiV2UserGetResponse.UserGetResponse user = dingDingService.getUserDetailByUserid(userIdByUnionIdV2.getUserid(), null);if (user != null) {List<UserRole> userRoleList = new ArrayList();//整理需要插入数据库字段String userid = user.getUserid();//判断当前用户是否已经插入过了Long userId = null;SysUser sysUser = sysUserService.selectUserByDingDingUserid(userid);if (sysUser != null) {userId = sysUser.getUserId();}else {sysUser = new SysUser();sysUser.setDingdingUserid(userid);sysUser.setAvatar(user.getAvatar());sysUser.setUnionId(user.getUnionid());sysUser.setPhonenumber(user.getMobile());sysUser.setEmail(user.getEmail());sysUser.setTitle(user.getTitle());String userName = user.getName();sysUser.setUserName(userName);//中文转拼音作为loginNameString loginName = PinYinUtils.getPingYin(userName);//根据当前公司人员重名情况,最大重名6人,故此处设置最大重名为10StringBuilder sb = new StringBuilder(loginName).append(",");for (int i = 1; i < 10; i++) {sb.append(loginName+String.valueOf(i)).append(",");}String loginnames = sb.toString();//判断一下当前是否已经存在了loginnameSysUser uniqueuser = sysUserService.selectLastUserByLoginName(Convert.toStrArray(loginnames));if (uniqueuser != null) {//获取当前重名用户的序号String number = uniqueuser.getLoginName().replace(loginName, "");//序号增加1在放回去拼接好int i = 0;if (StringUtils.isNotEmpty(number)) {i = Integer.parseInt(number) + 1;}else {//说明当前loginname还没有后续数字i = 1;}sysUser.setLoginName(loginName+i);}else {sysUser.setLoginName(loginName);}sysUser.randomSalt();//初始未编码前password为123456sysUser.setPassword(passwordService.encryptPassword(sysUser.getLoginName(), "123456", sysUser.getSalt()));sysUser.setCreateBy("扫码登录补充用户");sysUser.setCreateTime(new Date());sysUserService.insertSysUser(sysUser);userId=sysUser.getUserId();//插入用户的角色,初始用户都是普通角色UserRole ur = new UserRole();ur.setUserId(userId);if (Constants.ONE_KEY.equals(user.getUserid()) || Constants.TWO_KEY.equals(user.getUserid())) {ur.setRoleId(1L);}else {ur.setRoleId(2L);}userRoleList.add(ur);}//插入用户的部门List<Long> deptIdList = user.getDeptIdList();if (CollectionUtils.isNotEmpty(deptIdList)) {//插入部门之前需要清除之前的人员部门关系,以防钉钉部门变动而系统未感知int dele = sysUserDeptService.deleteSysUserDeptByUserId(userId);//插入人员部门关系表SysUserDept userDept = new SysUserDept();userDept.setUserId(userId);for (Long deptid : deptIdList) {userDept.setDeptId(deptid);userDept.setCreateBy("扫码登录补充用户");userDept.setCreateTime(new Date());sysUserDeptService.insertSysUserDept(userDept);}}//插入角色if (CollectionUtils.isNotEmpty(userRoleList)) {userRoleMapper.batchUserRole(userRoleList);}//登录系统return doLoginSystem(sysUser);}else {msg = "one";}}else {msg = "one";}}} catch (Exception e) {e.printStackTrace();msg = "two";}return redirect("/login?msg="+msg);}/*** 登录系统* @param use* @return*/private String doLoginSystem(SysUser use) {//已绑定账号则直接登录操作MyUsernamePasswordToken token = new MyUsernamePasswordToken(use.getUnionId(), use.getPassword(),false,true);// 登陆主流程Subject subject = SecurityUtils.getSubject();subject.login(token);return redirect("/index");}
}
复制代码
这里是改写后的登录代码,有需要的可以参考一下。
Java 覆盖 jar 包内的方法相关推荐
- php项目如何导jdbc包,JDBC-idea导入mysql连接java的jar包(mac)的方法
前言 1.本文使用的是mysql8.0版本 与5.0版本相比:导包方式相同,后面代码中的注册驱动方式不同 1.mac与pc的idea菜单和图标不是完全相同,但是步骤是差不多的 下载对应版本的jar包 ...
- java jar 源码乱码,java使用jar包时出现乱码的解决方法
java使用jar包时出现乱码的解决方法 发布时间:2020-06-17 17:06:29 来源:亿速云 阅读:105 作者:元一 jar包是什么: jar(Java Archive,Java归档文件 ...
- Java中jar包怎么使用_java中jar包的使用方法
java中jar包的使用方法 发布时间:2020-06-23 11:08:05 来源:亿速云 阅读:162 作者:Leah 这篇文章将为大家详细讲解有关java中jar包的使用方法,小编觉得挺实用的, ...
- Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)
Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...
- Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件
项目中,经常把一部分功能独立出来,做一个java project,然后打成jar包供其他项目引用.这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采 ...
- java执行jar中的main_浅谈java 执行jar包中的main方法
浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...
- Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略
Java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转html)之详细攻略 目录 POI的简介 1.基本功能 POI的安装 POI的使用方法(基 ...
- linux查看jar包内容命令,【达内Java教程】用linux查看jar包内文件命令
深圳java培训(sz.java.tedu.cn)专家教你用linux查看jar包内文件命令 jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-fil ...
- 【idea】【springboot】【jar】导出jar运行后报错java.lang.ClassNotFoundException 及springboot在idea导出jar包的正确方法
文章目录 一.问题描述 二.问题分析 三.springboot在idea中导出jar包的正确方法 1.删除原有MANIFEST.MF 2.工程设置 3.导出jar包 总结 一.问题描述 使用idea将 ...
最新文章
- 枚举参考Hurry Up(三分)
- linux C编程之makefile
- 学习使用Free RTOS ,移植最新的STM32 v3.5固件库
- 插入,冒泡,选择,快速,归并,堆排序,java 泛型实现
- PS5运行Linux,索尼发布最新驱动!PS5手柄现在已支持Linux系统
- 【SCOI2005】【BZOJ1083】繁忙的都市(MST模板)
- 在bitbucket.org上创建Git仓库
- nginx简单的rewrite配置
- 拓扑排序算法原理及Java代码实现
- 网络磁干扰仿真测试软件,上面这些软件哪个用来做电路的电磁干扰仿真比较好?...
- 博客留言外链是否有用?
- 金彩教育:详情页文案怎么写
- Linux命令大全,从A到Z,2023年收藏大吉!
- python excel xlwngs 受保护的视图解除方法
- 技术交流 | 装配式设计中BIM到底用在哪?
- vue手机端项目自适方案
- 汽车材料QC/T 942-2013 ELV中六价铬的检测
- 用计算机术语写情书,大学各专业学霸情书火了,医学专业浪漫风趣,数学专业很难看懂...
- 基于微信小程序的在线考试系统开题报告
- 编写函数判断一个整数是否为素数