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 源码解析之局部变量检查的更多相关文章

  1. 【Java源码解析】Thread

    简介 线程本质上也是进程.线程机制提供了在同一程序内共享内存地址空间运行的一组线程.对于内核来讲,它就是进程,只是该进程和其他一下进程共享某些资源,比如地址空间.在Java语言里,Thread类封装了 ...

  2. Java源码解析——集合框架(三)——Vector

    Vector源码解析 首先说一下Vector和ArrayList的区别: (1) Vector的所有方法都是有synchronized关键字的,即每一个方法都是同步的,所以在使用起来效率会非常低,但是 ...

  3. Java源码解析——集合框架(二)——ArrayBlockingQueue

    ArrayBlockingQueue源码解析 ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection ...

  4. [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析

    String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识,  ...

  5. [java源码解析]对HashMap源码的分析(二)

    上文我们讲了HashMap那骚骚的逻辑结构,这一篇我们来吹吹它的实现思想,也就是算法层面.有兴趣看下或者回顾上一篇HashMap逻辑层面的,可以看下HashMap源码解析(一).使用了哈希表得“拉链法 ...

  6. Java源码解析——集合框架(五)——HashMap源码分析

    HashMap源码分析 HashMap的底层实现是面试中问到最多的,其原理也更加复杂,涉及的知识也越多,在项目中的使用也最多.因此清晰分析出其底层源码对于深刻理解其实现有重要的意义,jdk1.8之后其 ...

  7. Java源码解析——集合框架(一)——ArrayList

    ArrayList源码分析 ArrayList就是动态数组,是Array的复杂版本,它提供了动态的增加和减少元素.灵活的设置数组的大小. 一.类声明 public class ArrayList< ...

  8. Java源码解析——Java IO包

    一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...

  9. java源码解析之String类(一)

    String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开Strin ...

随机推荐

  1. 纯html、css3、js的时钟

    之前在网上看了一些使用js写的时钟,但感觉实现的方法有点麻烦,所以就自己重新写了一个例子,样子有点丑,但方法比较简单,大家就凑合看吧 其中采用的主要方法是原生js里面的Data(时期)对象,以及它的. ...

  2. Oracle基本sql操作

    1.查询用户下的所有表 查询用户下的所有表 select distinct table_name from user_tab_columns; 2.搜索出前N条记录 Select a.*,rownum ...

  3. .NET开发者必备的工具箱

    本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...

  4. Com

  5. 在eclipse上开发nodejs

    首先到官网下载nodejs.地址:https://nodejs.org/en,可根据自己的操作系统选择下载. 安装好后.进入命令行输入node ,然后输入console.log("hello ...

  6. 用PHP调用Oracle存储过程方法

    //建立一个TEST表CREATE TABLE TEST (  ID        NUMBER(16)        NOT NULL,  NAME      VARCHAR2(30)      N ...

  7. href="javascript:function()" 和onclick的区别

    href='javascript:function()'和onclick能起到同样的效果,一般来说,如果要调用脚本还是在onclick事件里面写代码,而不推荐在href='javascript:fun ...

  8. No module named caffe

    1.直接打开终端,输入python,enter,输入import caffe,enter,不出错 2.直接打开终端,输入sudo su切换到root下,或者是直接 sudo python,enter, ...

  9. asp.net 微信开发失效汇总

    1.验证控件 在Iphone 5以上版本不兼容(改为js验证)

  10. redis和memcached

    Redis 1.主从配置(主从复制不会阻塞master.) 1)bind  192.168.1.2(请修改成本机的IP地址,要不然,客户端无法进行访问) 2)slaveof 192.168.1.1 6 ...