Java 源码解析之局部变量检查
package com.tang; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; public class ParseSource { public static boolean inMethod = false;
public static int braces = 0 ; // 名字,模板,类型的正则
public static String namePattern = "[_a-zA-Z]+\\w*";
public static String templatePattern = "(<[_a-zA-Z]+\\w*(, [_a-zA-Z]+\\w*)*>)?";
public static String typePattern = namePattern + templatePattern + "(\\[\\]){0,2}"; // 参数的正则
public static String argPatternZero = "\\s*"; // 无参数
public static String argPatternSingle = typePattern + "\\s+" + namePattern;
public static String argPatternDynamic = typePattern + "\\s*" + "\\.\\.\\." + "\\s*" + namePattern; // 动态参数
public static String argPattern = argPatternSingle+ "(\\s*,\\s*" + argPatternSingle + ")*" + "(\\s*,\\s*" + argPatternDynamic + ")?"; //多个参数 + 动态参数
public static String argsPattern = "(" + argPatternZero + "|" + argPatternDynamic + "|" + argPattern + ")"; public static void main(String[] args) { String filePath = "G:\\workspace2\\JavaJFX\\src\\com\\bowen\\LocalVarTest.java";
parseFile(filePath); // String mSign = "public boolean skipTo(int a,Object...o) {";
// boolean b = isMethod(mSign);
// System.out.println(b);
} private static void parseFile(String filePath) {
if(filePath == null || "".equals(filePath))
return; File file = new File(filePath);
if(!file.exists())
return; BufferedReader reader = null;
PrintWriter writer = null;
String pathname = "C:\\LocalVarTest.java"; String rBrace = "\\s*\\)?\\s*\\{";
String rLocalVar = "\\s*" + argPatternSingle + "\\s*" + ";";
//String rLocalVarV = argPatternSingle + "\\s+" + "="; try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
writer = new PrintWriter(new File(pathname));
byte[] b = new byte[8192];
String buffer;
while((buffer = reader.readLine()) != null){
if(isMethod(buffer)){
inMethod = true;
System.out.println(buffer);
if(buffer.indexOf('{') != -1)
braces++;
writer.write(buffer);
writer.println();
continue;
} if(inMethod){
if(buffer.indexOf('{') != -1){
braces++;
} if(buffer.indexOf('}') != -1){
braces--;
} if(braces == 0)
inMethod = false; if(buffer.matches(rLocalVar)){
int pos = buffer.indexOf(';');
if(buffer.indexOf("int") != -1 ||
buffer.indexOf("short") != -1 ||
buffer.indexOf("byte") != -1 ||
buffer.indexOf("long") != -1){
buffer = buffer.substring(0, pos) + " = 0;";
} else if(buffer.indexOf("float") != -1 ||
buffer.indexOf("double") != -1){
buffer = buffer.substring(0, pos) + " = 0.0;";
} else if(buffer.contains("boolean")){
buffer = buffer.substring(0, pos) + " = false;";
} else if(buffer.contains("char")){
buffer = buffer.substring(0, pos) + " = \\' \\' ;";
} else {
buffer = buffer.substring(0, pos) + " = null;";
}
}
} writer.write(buffer);
writer.println();
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally { if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(writer != null){
writer.close();
}
} } public static boolean isMethod(String mSign){
boolean b = false; // 方法签名的正则
String methodSignaturePattern = "\\s*((public|protected|private)\\s)?\\s*(\\s*static\\s+)?(\\s*final\\s+)?" +
typePattern + "\\s+" + namePattern + "\\s*\\(\\s*" + argsPattern + "\\s*\\)" + "\\s*(\\{)?"; // System.out.println(methodSignaturePattern);
b = mSign.matches(methodSignaturePattern); return b;
} }
Java 源码解析之局部变量检查的更多相关文章
- 【Java源码解析】Thread
简介 线程本质上也是进程.线程机制提供了在同一程序内共享内存地址空间运行的一组线程.对于内核来讲,它就是进程,只是该进程和其他一下进程共享某些资源,比如地址空间.在Java语言里,Thread类封装了 ...
- Java源码解析——集合框架(三)——Vector
Vector源码解析 首先说一下Vector和ArrayList的区别: (1) Vector的所有方法都是有synchronized关键字的,即每一个方法都是同步的,所以在使用起来效率会非常低,但是 ...
- Java源码解析——集合框架(二)——ArrayBlockingQueue
ArrayBlockingQueue源码解析 ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection ...
- [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析
String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, ...
- [java源码解析]对HashMap源码的分析(二)
上文我们讲了HashMap那骚骚的逻辑结构,这一篇我们来吹吹它的实现思想,也就是算法层面.有兴趣看下或者回顾上一篇HashMap逻辑层面的,可以看下HashMap源码解析(一).使用了哈希表得“拉链法 ...
- Java源码解析——集合框架(五)——HashMap源码分析
HashMap源码分析 HashMap的底层实现是面试中问到最多的,其原理也更加复杂,涉及的知识也越多,在项目中的使用也最多.因此清晰分析出其底层源码对于深刻理解其实现有重要的意义,jdk1.8之后其 ...
- Java源码解析——集合框架(一)——ArrayList
ArrayList源码分析 ArrayList就是动态数组,是Array的复杂版本,它提供了动态的增加和减少元素.灵活的设置数组的大小. 一.类声明 public class ArrayList< ...
- Java源码解析——Java IO包
一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...
- java源码解析之String类(一)
String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开Strin ...
随机推荐
- web 安全的前期准备哦
学习web安全 需要的软件 和 基础 基础会在以后发出来 软件 在网上都可以下 首先 你要有一款虚拟机软件 虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样 ...
- eclipse安装svn
- zw.delphi不同版本程序运行速度测试
{ zw.delphi不同版本程序运行速度测试 delphi无论是开发,编译,还是运行,速度方面向来不差,笔者很少进行这种微粒度的优化,调试. 最近,因为项目需要,发现:同一个函数模块,差不多同样的代 ...
- 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题
Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...
- catalina
用catalina启动tomcat容器,将项目放到tomcat中,通过cmd:启动:catalina,相当于本地的测试环境.
- 剑指offer——树的子结构 (JAVA代码)
版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...
- Oracle RAC安装部署文档
1. 部署环境步骤 1.1 软件环境 操作系统:CentOS release 6.5(推荐使用5.*的系统)192.168.1.151 racnode1 192.168.1.152 ...
- [转]iOS开发中@property的属性weak nonatomic strong readonly等介绍
转载地址: http://www.lvtao.net/ios/504.html @property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法.在Xcode4.5以及以后 ...
- centos常用操作
文件夹赋权chmod -R 777 文件夹 zip压缩和unzip解压缩命令详解以下命令均在/home目录下操作cd /home #进入/home目录1.把/home目录下面的mydata目录压缩为m ...
- AngularJS使用指南
ng-app 定义一个AngularJS应用程序 ng-model 把元素值绑定到AngularJS应用程序 ng-blind 把AngularJS应用程序数据绑定到HTML视图上 ng-init 初 ...