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;
}
}


发布评论