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 ...
随机推荐
- sed
命令行格式为: sed [-nefri] ‘command’ 输入文本/文件 常用选项: -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的用法中 ...
- 导出Excel And 导出word
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default6.aspx. ...
- visual studio 两个以上sln 引用同一个project ,生成时会改变projectguid问题
当两个以上解决方案添加现有项,选择了同一个项目,那么在 sln 文件中,会自己带一个guid. 当打开两个解决方案,一个生成时,会影响另一个的project值,导致每次都看到了签出. 解决办法,打开共 ...
- javaweb 学习资源
http://jinnianshilongnian.iteye.com/category/231099
- 修改后的CopyFile类
这是修改后的CopyFile类,前面那个类有局限性,它不能复制大文件 这是我第一次写成一个能够实际应用的类,感谢博主们的无私奉献,感谢SeayXu老师的提点 但是这个类也并不是完美无缺,它复制文件没有 ...
- C语言回顾-指针
1.指针:地址 指针变量:存放指针的变量 指针变量的定义:数据类型 *指针变量名 或者 数据类型* 指针变量名 指针变量的初始化:int *p=&a;int *p=NULL;(不能先定义后初始 ...
- python 图片爬虫
#!/usr/bin/env python #coding:utf-8 import urllib import re def GetHtml(url): """获取HT ...
- 【转载】Windows下VSCode编译调试c/c++
懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...
- win7下matlab2016a配置libsvm
1.下载libsvm https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.解压到matlab2016a的安装目录的toolbox下 例如我的D:\Program ...
- JSON总结
JSON: 关于JSON,最重要的是要理解它是一种数据格式,不是一种编程语言.虽然JSON与JavaScript具有相同的语法形式与JSON具有相同的语法形式,但JSON并不从属于JavaScrip ...