
1. 了解项目数据库的表结构,这个方面是最容易忘记的,有时候我们只顾着看每一个方法是怎么进行的,却没有去了解数据库之间的主外键关联。其实如果先了解数据库表结构,再去看一个方法的实现会更加容易。
2. 然后需要过一遍web.xml,知道项目中用到了什么,,过滤器,拥有哪些配置文件。如果是,一般负责过滤请求,进行AOP等;如果是,可能是定时任务,初始化任务;配置文件有如使用了spring后的读取mvc相关,db相关,service相关,aop相关的文件。
3. 查看,代码,知道拦截了什么请求,这个类完成了怎样的工作。有的人就是因为缺少了这一步,自己写了一个action,配置文件也没有写错,但是却怎么调试也无法进入这个action,直到别人告诉他,请求被拦截了。
4. 接下来,看配置文件,首先一定是mvc相关的,如springmvc中,要请求哪些请求是静态资源,使用了哪些view策略,控制器注在哪个包下等。然后是db相关配置文件,看使用了什么数据库,使用了什么orm框架,是否开启了二级缓存,使用哪种产品作为二级缓存,事务管理的处理,需要扫描的实体类放在什么位置。最后是spring核心的ioc功能相关的配置文件,知道接口与具体类的注入大致是怎样的。当然还有一些如aspectj置文件,也是在这个步骤中完成。
5. log相关文件,日志的各个级别是如何处理的,在哪些地方使用了log记录日志。
6. 从上面几点后知道了整个开源项目的整体框架,阅读每个方法就不再那么难了。
7. 当然如果有项目配套的开发文档也是要阅读的。
源码解析-偏向锁撤销流程解读源码链接:简单总结下偏向撤销的流程:细节补充:如何判断偏向所有者没有正在持有该偏向锁?分两步,首先判断偏向所有者是否还活着,如果还活着,则遍历它的栈,看是否能找到关联该锁的锁记录,如果找到,则正在持有,如果没找到,则没有持有。(遍历过程在一个安全点执行,此时偏向所有者被阻塞。)偏向所有者正在持有该偏向锁,如何将其撤销为轻量级锁?遍历偏向所有者的栈,修改与该锁关联的所有锁记录,让偏向所有者以为它对该对象加的就是轻量级锁。
源码中的highest_lock,为什么说是最早关联偏向锁的锁记录呢?首先,锁记录在栈里是连续存放的。请求获取锁时,按照从低地址到高地址的顺序,找在已关联该锁的锁记录之前,最后一个空闲的锁记录(没有指向任何锁对象)。请求锁的源码如下:而撤销偏向锁时,遍历偏向所有者的锁记录,也是按照从低地址到高地址的顺序,但它没有break的逻辑,因为它要处理所有关联该锁的锁记录。所以退出循环后,highest_lock指向的是最早关联该锁的锁记录。
这篇:源码解析-触发批量撤销或批量重偏向的条件,介绍了批量撤销的触发条件。包含批量撤销逻辑的源码:禁用类的可偏向属性有两点作用:对于批量撤销时,正在被线程持有的偏向锁,通过在安全点遍历所有Java线程的栈,将偏向锁撤销为轻量级锁。
JAVA源码解析的时候Character.MIN_RADIX为什么=2?‘’占一个字符位,你想一下,如果值是1,那么你怎么输入汉字Character类的使用方法Character:字符类型1、属性。staticintMIN_RADIX:返回最小基数。
java解析eml的源代码//?从EML文件得到MimeMessage对象MimeMessage?message?=?new?MimeMessage(session,?new?FileInputStream(emlFile));public?static?String?getMailSubject(Message?message)?throws?IOException?{return?MimeUtility.decodeText(message.getSubject());}public?static?String?getMailSender(Message?message)?throws?Exception?{String?emailSender?=?null;Address[]?addresses?=?message.getFrom();if?(addresses?==?null?||?addresses.length??1)?{throw?new?IllegalArgumentException("该邮件没有发件人");}//?获得发件人InternetAddress?address?=?(InternetAddress)?addresses[0];String?senderName?=?address.getPersonal();if?(senderName?!=?null)?{senderName?=?MimeUtility.decodeText(senderName);emailSender?=?senderName?+?""?+?address.getAddress()?+?"";}?else?{senderName?=?address.getAddress();}return?emailSender;}public?static?String?getMailRecipients(Message?message,?Message.RecipientType?recipientType)?throws?Exception?{StringBuilder?builder?=?new?StringBuilder();Address[]?addresses?=?null;if?(recipientType?==?null)?{addresses?=?message.getAllRecipients();}?else?{addresses?=?message.getRecipients(recipientType);}if?(addresses?==?null?||?addresses.length??1)?{throw?new?IllegalArgumentException("该邮件没有收件人");}for?(Address?address?:?addresses)?{InternetAddress?iAddress?=?(InternetAddress)?address;builder.append(iAddress.toUnicodeString()).append(",?");}return?builder.deleteCharAt(builder.length()?-?1).toString();}public?static?String?getMailSendDate(Message?message,?String?pattern)?throws?Exception?{String?sendDateString?=?null;if?(pattern?==?null?||?"".equals(pattern.trim()))?{pattern?=?"yyyy年MM月dd日?E?HH:mm";}Date?sendDate?=?message.getSentDate();sendDateString?=?new?SimpleDateFormat(pattern).format(sendDate);return?sendDateString;}public?static?boolean?containsAttachment(Part?part)?throws?Exception?{boolean?flag?=?false;if?(part?!=?null)?{if?(part.isMimeType("multipart/*"))?{MimeMultipart?mp?=?(MimeMultipart)?part.getContent();for?(int?i?=?0;?i??mp.getCount();?i++)?{BodyPart?bodyPart?=?mp.getBodyPart(i);String?disposition?=?bodyPart.getDisposition();if?(disposition?!=?null??(Part.ATTACHMENT.equalsIgnoreCase(disposition)||?Part.INLINE.equalsIgnoreCase(disposition)))?{flag?=?true;}?else?if?(bodyPart.isMimeType("multipart/*"))?{flag?=?containsAttachment(bodyPart);}?else?{String?contentType?=?bodyPart.getContentType();if?(contentType.indexOf("application")?!=?-1)?{flag?=?true;}if?(contentType.indexOf("name")?!=?-1)?{flag?=?true;}}if?(flag)break;}}?else?if?(part.isMimeType("message/rfc822"))?{flag?=?containsAttachment((Part)?part.getContent(),?destDir);}}return?flag;}public?static?boolean?isSeen(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}return?message.getFlags().contains(Flags.Flag.SEEN);}public?static?boolean?isReplaySign(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}boolean?replaySign?=?false;String[]?headers?=?message.getHeader("Disposition-Notification-To");if?(headers?!=?null??headers.length??0)?{replaySign?=?true;}return?replaySign;}public?static?String?getMailPriority(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}String?priority?=?"普通";String[]?headers?=?message.getHeader("X-Priority");if?(headers?!=?null??headers.length??0)?{String?mailPriority?=?headers[0];if?(mailPriority.indexOf("