import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
public class MethodCallCountTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
try {
if (!“java/util/regex/Pattern$CharProperty”.equals(className)
&& !“java/util/regex/Pattern$BmpCharProperty”.equals(className)) {
return classfileBuffer;
}
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassAdapter adapter = new MethodCallClassAdapter(writer, className);
ClassReader reader = new ClassReader(classfileBuffer);
reader.accept(adapter, 0);
// 生成新類(lèi)字節碼
return writer.toByteArray();
} catch (Exception e) {
e.printStackTrace();
// 返回舊類(lèi)字節碼
return classfileBuffer;
}
}
}
package com.alibaba.taobao.tinyprofiler;
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private static AtomicInteger methodCallCount = new AtomicInteger(0);
public static void printAndIncCount(String className, String methodName) {
System.out.println(className + “.” + methodName + “ called, total times ” + methodCallCount.incrementAndGet());
}
}
OK,現在我們輸入:
String regex = “.*.*.*D”;
String target = “22asdvasdx”;
Pattern.compile(regex).matcher(target).matches();
System.out.println(“Xuanyin’s estimated count: ” + findTotalWays(4, target.length()) + “; depth: ” + recursionDepth);
輸出結果(注:這里的 depth 并不是遞歸深度,而是遞歸次數,當時(shí)搞錯了):
腫么樣,分毫不差~OK,那么我們現在回到最開(kāi)始的問(wèn)題,輸入 .*.*.*.*.*.*D 去匹配 com.taobao.binary.bogda.query.service.RulesInfoQueryService:1.0.0.daily
結果顯示需要 5 億 匹配, 還要進(jìn)出棧近 2.5 億次哦
這里我的機器是i7-2600K 超4.5G,結果顯示需要5秒,這還是不是最差的情況哦~
而每次用戶(hù)查詢(xún)要匹配近600個(gè)這樣的字符串,~你說(shuō)匹配得完嘛
原文轉自:http://kjueaiud.com