Java应用之删除Java文件的Main方法
先说下为什么要删除main方法,由于部分同事在本地写了main方法测试代码,提交代码时候忘记把main方法删除,导致代码不规范,所以需要有一个方法能删除java文件中的main方法。
首先,常用的main方法写法有2种,那种变态的使用16进制写的不算。
main方法的一般写法:
public static void main(String[] args) {
System.out.println("Main Method");
}
另一种使用可变参数的写法:
public static void main(String... args) {
System.out.println("Main Method");
}
一般人的想法是使用main(String[] args)或者main(String... args)正则匹配,但是java中可以把方法名写到不同的行上的。
public static void main (
String... args) {
System.out.println("Main Method!");
}
String...后面的那个参数可以随便写不同的名字:
public static void main (
String... args2) {
System.out.println("Main Method!");
}
应该使用main(String... [a-zA-Z0-9_])这类的匹配,匹配前还得去除多余的空格。
下面介绍我写的去除main方法。
我的思路是得到main函数的起始范围,去掉就OK了。同时也考虑了这种情况:
public static void main(String[]args,int len)
{
System.out.println("another Method!");
}
详情可以看代码,我就不一一解释了,代码写的不是很好,请见谅。
public class 删除Main方法 {
public static void main(String[] args) throws Exception {
删除Main方法 t = new 删除Main方法();
String content = t.getFileContent("F:/saveFile/tmp/c/SimpleTest.java",
"utf-8");
String result = t.delMainMethod(content);
t.writeStrToFile(result, "F:/saveFile/tmp/c/SimpleTest.java", "utf-8");
}
public String delMainMethod(String content) {
int publicStart = -1, mainStart = -1;
int checkStart = -1;
String tmp = null, tmp2 = null;
mainStart = content.lastIndexOf("main");
String tmpContent = new String(content);
// 得到真正的main方法
while ((mainStart = tmpContent.lastIndexOf("main")) != -1) {
tmp2 = new String(tmpContent.substring(mainStart));
checkStart = tmp2.indexOf(")");
tmp2 = new String(tmpContent.substring(mainStart - 1, mainStart
+ checkStart + 1));
tmp2 = tmp2.replaceAll("#_end_#", "\n");
tmp2 = tmp2.replaceAll("\\n", "");
tmp2 = tmp2.replaceAll("\\s+", "");
if (tmp2.startsWith("main(String") && (tmp2.indexOf(",") == -1)) {
break;
}
tmpContent = new String(tmpContent.substring(0, mainStart));
}
if (mainStart != -1) {
tmp = new String(content.substring(0, mainStart));
// 得到main方法的开始位置
publicStart = tmp.lastIndexOf("public");
}
if (publicStart != -1) {
tmp = new String(content.substring(mainStart));
}
if (tmp == null) {
// 去掉多余空白行
content = content.replaceAll("#_end_#", "\r\n");
content = content.replaceAll("\\s{2,}\\r\\n", "\r\n");
return content;
}
// 得到main方法的结束位置
char[] tmpChar = tmp.toCharArray();
int bracketStart = 0, bracketEnd = 0;
for (int i = 0, len = tmpChar.length; i < len; i++) {
if (tmpChar[i] == '{') {
bracketStart++;
} else if (tmpChar[i] == '}') {
bracketEnd = i;
bracketStart--;
}
if (i != 0 && bracketStart == 0 && bracketEnd != 0) {
break;
}
}
StringBuffer contentBuffer = new StringBuffer(5120);
// 截取字符串
contentBuffer.append(content.substring(0, publicStart)).append(
content.substring(mainStart + bracketEnd + 1));
content = null;
content = contentBuffer.toString();
// 去掉多余空白行
content = content.replaceAll("#_end_#", "\r\n");
content = content.replaceAll("\\s{2,}\\r\\n", "\r\n");
return content;
}
public String getFileContent(String fileName, String chartSet)
throws Exception {
if (chartSet == null) {
chartSet = "utf-8";
}
StringBuffer buffer = new StringBuffer(5120);
String line = null;
InputStream is = new FileInputStream(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(is,
chartSet));
while ((line = reader.readLine()) != null) {
buffer.append(line).append("#_end_#");
}
return buffer.toString();
}
public void writeStrToFile(String str, String filePath, String charsetName)
throws Exception {
if (charsetName == null) {
charsetName = "utf-8";
}
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
filePath), charsetName);
out.write(str);
out.close();
}
}
测试文件如下:
public class SimpleTest {
public void fun() {
System.out.println("hello world");
}
public static void mainTest(String[] args) {
System.out.println("another method");
}
public static void Tmain(String[] args) {
System.out.println("another Method!");
}
private static void main()
{
System.out.println("another Method!");
}
private static void main(String[]args,int len)
{
System.out.println("another Method!");
}
public static void main (
String... args2) {
System.out.println("Main Method!");
}
public static void main4Test(String ...args) {
System.out.println("another method");
}
public void fun2() {
System.out.println("hello world2");
}
public void main5Test() {
System.out.println("another method");
}
}
处理结果为:
测试文件:
public class SimpleTest {
public void fun() {
System.out.println("hello world");
}
public static void mainTest(String[] args) {
System.out.println("another method");
}
public static void Tmain(String[] args) {
System.out.println("another Method!");
}
public static void main()
{
System.out.println("another Method!");
}
public static void main(String[]args,int len)
{
System.out.println("another Method!");
}
public static void main (
String... args2) {
System.out.println("Main Method!");
}
public static void main4Test(String ...args) {
System.out.println("another method");
}
public void fun2() {
System.out.println("hello world2");
}
public void main5Test() {
System.out.println("another method");
}
}
处理结果为:
如果没有main函数,处理结果为:
有不同方法的,请留言,谢谢,我知道我这种方法是最笨的,欢迎各位指教。
本文系原创,转载请注明出处,谢谢。
全文完。