2024年2月11日发(作者:)

思路:

通过java 反射技术来查找全局PreparedStatement 是否有资源未关闭的情况(局部PreparedStatement 无法用反射技术实现)。

1. 通过java 反射获取全局PreparedStatement 对象

2. 先獨具某路徑下的java原文件,通過原文件的包名和java文件名稱來得到java反射的e的參數。然後通過反射后的對象獲取該類中的全局變數。

3. 通过读取java原文件的每行数据,看是否有关闭资源的情况(其中涉及到正则表达式去掉行中的空格)

4. 事例中以PREPAREDSTATEMENT和RESULTSET 為例。其它更加各自遇到的情況處理。

內容不明白的可以諮詢我。QQ:286117803

如果有不便處理的大家可以一起討論。

import edReader;

import ;

import ader;

import ;

import ;

import r;

import n;

public class CheckClose {

StringBuffer sourcebuffer=null;

private int line=0;

private int countbject=0;

String classpath=null;

/**

* @param args

*/

public static void main(String[] args) {

CheckClose cc=new CheckClose();

//读取资源未关闭方法,该路径为project的路径(访问java 原文件需要用路径)

le("D:Eclipse_swingworkspace comtest");

n("-----finish-------");

}

private void CheckJava(String pak,String path){

// TODO 自?生成方法存根

Class c1;

sourcebuffer=null;//一个类打印一次信息,归每次清空一次

try {

//去掉文件的后缀名,组合成包名

c1 = e ((".java")[0]);

Field [] me=laredFields();//获取类中声明的全局类

String ClassPackage=null;

countbject=0;

for (int i=0;i<;i++){

String forClass=me[i].getType().toString();//获取对象类型

try{

ClassPackage=(" ")[1];

}catch(Exception e){

//有无法预知的情况就跳出循环

break;

}

String [] pathsize= (".");

String classes=pathsize[-1];//获取类名称

//PreparedStatement 对象关闭检查

if(rCase().indexOf("PREPAREDSTATEMENT")>-1){

String source=me[i].getName()+".close()";

if(!readFileByLines(path,source)){

//部份类中声明了对象,但未引用,故需剔除该中资料

if(!readFileByLines(path,(me[i].getName()+"."))){

continue;

}

setMsg(pak,me[i].getName(),"PreparedStatement: ");

}

}

// RESULTSET 对象关闭检查

if(rCase().indexOf("RESULTSET")>-1){

String source=me[i].getName()+".close()";

if(!readFileByLines(path,rCase())){

//部份类中声明了对象,但未引用,故需剔除该中资料

if(!readFileByLines(path,(me[i].getName()+"."))){

continue;

}

setMsg(pak,me[i].getName(),"ResultSet: ");

}

}

}

if(sourcebuffer!=null&&ng().length()>0){

("----------------------------------");

}

} catch (ClassNotFoundException e) {

// TODO 自?生成 catch ?

}//.getClass();

if(sourcebuffer!=null&&ng().length()>0){

n(ng());

}

}

private void setMsg(String pak,String obj,String type){

if(sourcebuffer==null){

line++;

sourcebuffer=new StringBuffer();

("line="+line+" "+(".java")[0]);

("rn");

}

(type+obj);

("rn");

}

/**

* 读取java文件

* @param path

*/

private void readfile(String path){

classpath=path;

File file=new File(path);

//为目录时

if(ctory()){

File [] fil=les();

for(int i=0;i<;i++){

//是java文件时

if(!fil[i].isDirectory()&&fil[i].getName().toUpperCase().indexOf(".JAVA")>-1){

// 获取包名

String pak= readFileByFirstLines(fil[i].getPath());

// 查询资源是否关闭,去掉文件的后缀名,组合成包名

CheckJava(pak+"."+fil[i].getName(),fil[i].getPath());

}else if(fil[i].isDirectory()){//为目录时

readfile(fil[i].getPath());

}

}

}else{

// 获取包名

String pak= readFileByFirstLines(h());

// 查询资源是否关闭

CheckJava(pak+"."+e(),h());

}

}

/**

* 因为已来源已限定为.java,如果在非缺省包,情况都会获取到包名

* 如果无包名,返回null

* @param fileName

* @return

*/

public String readFileByFirstLines(String fileName){

String pak=null;

File file = new File(fileName);

BufferedReader reader = null;

try {

reader = new BufferedReader(new FileReader(file));

String tempString = null;

if((tempString = ne())==null){//空文件

return pak;

}else{

if(f("package ")>-1){//第一行为包名

pak=("package ")[1].split(";")[0];

return pak;

}

}

while ((tempString = ne()) != null){//第一行未找到包名,往下找包名,直到找到包名

if(f("package ")>-1){

pak=("package ")[1].split(";")[0];

return pak;

}

}

} catch (Exception e) {

tackTrace();

} finally {

try {

if (reader != null){

();

}

}catch (Exception e1) {

}

}

return null;

}

/**

* 在java文件中(按行)找是否有调用findStirng(类对象的关闭资源的方法如

())

* 找到findStirng 返回true,否则返回false

* @param filename 文件的路徑

* @param findStirng 需要查找的對象

* @return

*/

public boolean readFileByLines(String fileName,String findStirng){

findStirng=rCase();

File file = new File(fileName);

BufferedReader reader = null;

try {

reader = new BufferedReader(new FileReader(file));

String tempString = null;

while ((tempString = ne()) != null){

tempString=split(tempString);//过滤空格

if(rCase().indexOf(findStirng)>-1){

return true;

}

}

} catch (Exception e) {

tackTrace();

} finally {

try {

if (reader != null){

();

}

}catch (Exception e1) {

}

}

return false;

}

/*过滤空格

*

*/

private String split(String tempString){

String regEx_script="s";

Pattern p_script;

Matcher m_script;

p_script = e(regEx_script);//去掉行中空格

m_script = p_r(tempString);

tempString = m_eAll(""); //过滤空格标签

return tempString;

}

}