Javac

package com.leon;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.sun.tools.javac.tree.TreeScanner;

public class Main {
	public static void main(String[] args) throws IOException {
		TreeScanner ms = new MethodScanner();
		ScanFile sf = new ScanFile(ms);

		Collection<File> list = FileUtils.listFiles(new File("D:/llsp/src"), new String[] { "java" }, true);
		System.out.println(list.size());
		for (Iterator<File> iterator = list.iterator(); iterator.hasNext();) {
			File object = iterator.next();
			sf.scan(object.getAbsolutePath());
		}
		List<Node> rs = Statistics.getInstance().getTop10();
		for (int i = 0; i < rs.size(); i++) {
			System.out.println(rs.get(i));
		}
	}

}
package com.leon;

import java.util.Iterator;

import javax.lang.model.element.Modifier;

import org.apache.log4j.Logger;

import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.List;

public class MethodScanner extends TreeScanner {
	Logger logger = Logger.getLogger(MethodScanner.class);

	public void visitApply(JCTree.JCMethodInvocation paramJCMethodInvocation) {
		Symbol sym = TreeInfo.symbol(paramJCMethodInvocation.meth);
		if (filter(sym)) {
			String returnType = getShortType(paramJCMethodInvocation.type);
			StringBuffer sb = new StringBuffer();
			sb.append(sym.outermostClass().className() + "``");
			Iterator<Modifier> it = sym.getModifiers().iterator();
			while (it.hasNext()) {
				sb.append(it.next() + " ");
			}
			sb.append(returnType + " ");
			sb.append(sym.name);
			List<JCExpression> list = paramJCMethodInvocation.args;
			if (list != null && !list.isEmpty()) {
				sb.append(genArs(list));
			} else {
				sb.append("()");
			}
			Statistics.getInstance().put(sb.toString());
			logger.info(sb.toString());
		}
		super.visitApply(paramJCMethodInvocation);
	}

	private String genArs(List<JCExpression> list) {
		StringBuffer args = new StringBuffer();
		args.append("(");
		for (int i = 0; i < list.size(); i++) {
			String type = getShortType(list.get(i).type);
			args.append(type + " " + "arg" + i + ",");
		}
		args.replace(args.length() - 1, args.length(), ")");
		return args.toString();
	}

	public boolean filter(Symbol sym) {
		if (sym.isConstructor()) {
			return false;
		}
		String clazz = sym.outermostClass().className();
		if (canPass(clazz)) {
			return true;
		}
		return false;
	}

	private boolean canPass(String clazz) {
		String[] pass = new String[] { "com.citi", "com.citigroup", "com.leon" };
		for (int i = 0; i < pass.length; i++) {
			if (getPackage(clazz).startsWith(pass[i])) {
				return true;
			}
		}
		return false;
	}

	private String getPackage(String owner) {
		int i = owner.lastIndexOf(46);
		if (i != -1) {
			String str = owner.substring(0, i);
			return str;
		}
		return null;
	}

	private String getShortType(Type type) {
		// if (type.isPrimitive() || type.getKind() == TypeKind.VOID) {
		// return type.toString();
		// } else {
		// String rs = type.toString();
		// return rs.substring(getPackage(rs).length() + 1);
		// }
		return type.toString();
	}
}

package com.leon;

import java.io.IOException;

import javax.tools.JavaFileObject;

import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.List;

public class ScanFile {
	private JavaCompiler javaCompiler;
	private TreeScanner scanner;

	public ScanFile(TreeScanner scanner) {
		Context context = init();
		this.scanner = scanner;
		javaCompiler = JavaCompiler.instance(context);
	}

	private Context init() {
		Context context = new Context();
		JavacFileManager.preRegister(context);
		return context;
	}

	@SuppressWarnings("deprecation")
	public JCTree.JCCompilationUnit parse(String paramString)
			throws IOException {
		return javaCompiler.parse(paramString);
	}

	public JCTree.JCCompilationUnit parse(JavaFileObject paramJavaFileObject) {
		return javaCompiler.parse(paramJavaFileObject);
	}

	public List<JCTree.JCCompilationUnit> envTrees(JCTree.JCCompilationUnit unit) {
		return javaCompiler.enterTrees(List.of(unit));
	}

	public Env<AttrContext> annotateTypeInfo(Env<AttrContext> paramEnv) {
		return javaCompiler.attribute(paramEnv);
	}

	public void scan(String paramString) throws IOException {
		envTrees(parse(paramString));
		while (!javaCompiler.todo.isEmpty()) {
			Env<AttrContext> paramEnv = javaCompiler.todo.remove();
			scanner.scan(annotateTypeInfo(paramEnv).tree);
		}
	}
}

package com.leon;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Statistics {
	private Map<String, Integer> map = new HashMap<String, Integer>();
	public static Statistics instance;

	private Statistics() {

	}

	public static Statistics getInstance() {
		if (instance == null) {
			instance = new Statistics();
		}
		return instance;
	}

	public void put(String key) {
		if (map.containsKey(key)) {
			map.put(key, map.get(key) + 1);
		} else {
			map.put(key, 1);
		}
	}

	public List<Node> getTop10() {
		List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
		Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
			public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		List<Node> rs = new ArrayList<Node>();
		for (int i = 0; i < 10; i++) {
			String[] strs = list.get(i).getKey().split("``");
			rs.add(new Node(strs[0], strs[1], list.get(i).getValue()));
		}
		return rs;
	}
}

class Node {
	public String className;
	public String methodName;
	public int count;

	public Node(String className, String methodName, int count) {
		super();
		this.className = className;
		this.methodName = methodName;
		this.count = count;
	}

	@Override
	public String toString() {
		return "[className=" + className + ", methodName=" + methodName + ", count=" + count + "]";
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值