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. 实验三——for语句及分支结构else-if

    1.本节课学习到的知识点: (1)for语句是循环语句,它可以实现c语句的重复执行 (2)for语句中的3个表达式的执行顺序和书写顺序不同 (3)遇到复合语句时要用大括号将几句话括起来,复合语句在语法 ...

  2. 论文阅读(Xiang Bai——【CVPR2015】Symmetry-Based Text Line Detection in Natural Scenes)

    Xiang Bai--[CVPR2015]Symmetry-Based Text Line Detection in Natural Scenes 目录 作者和相关链接 方法概括 创新点和贡献 方法细 ...

  3. 想学习Android开发

    最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...

  4. win8 win10 安装msi 提示2502、2503的错误代码

    前言: 归根到底是权限不够导致的.win7应该不会有这个问题.   问题发生: 换了个电脑,装个win10预览版玩玩,发现python的msi安装文件安装不了.错误代码是2502.   其实我已经在w ...

  5. 解决VS2015启动时Package manager console崩溃的问题 - Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope

    安装VS2015,启动以后,Package manager console崩溃,错误信息如下: Windows PowerShell updated your execution policy suc ...

  6. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  7. 剖析javascript全局变量和局部变量

    首先要记住: javascript是弱类型语言,它只有一种变量类型(var),为变量赋值时会自动判断类型并进行转换. 全局变量和局部变量如何声明? 全局变量声明: 第一种方式(函数外) var a; ...

  8. rabbimq连接问题处理

    今天遇到一个rabbitmq的连接问题,之前自己写代码测试的时候并没有出现过,所以做个小总结,由于是其他项目测试部署环境发现的问题,所以一开始排查还是有点坑... 客户端上新建一个rabbitmq的c ...

  9. 技术之余。。。电吉他自弹 魂斗罗 solo

    测试一下 ---恢复内容开始--- ---恢复内容结束---

  10. 一个可拖拽的DIV框框

    http://codepen.io/lrelia/pen/bEyLB 使用了JQuery UI库, draggable来自于JQuery UI库