package com.sirding;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
public class MyAgent {
private static Instrumentation inst = null;
public static void premain(String agentArgs, Instrumentation _inst){
System.out.println("PerfMonAgent.premian() was called.");
inst = _inst;
ClassFileTransformer trans = new MyTransform();
System.out.println("Adding a PerfMonXformer instance to the JVM.");
inst.addTransformer(trans);
}
}
public class Test{
public static void main(String[] args){
System.out.println("hello world");
new Test().myTest();
}
public void myTest(){
System.out.println("===============================================");
}
}
将Test.java java-inst.jar放在同一个文件中,执行如下命令
javac Test.java 生成Test.class
java -javaassist:java-inst.jar Test
C:\yrtz\test\aa>java -javaagent:java-inst-1.jar Test
PerfMonAgent.premian() was called.
Adding a PerfMonXformer instance to the JVM.
Transforming java/lang/invoke/MethodHandleImpl
Transforming java/lang/invoke/MethodHandleImpl$1
Transforming java/lang/invoke/MethodHandleImpl$2
Transforming java/util/function/Function
Transforming java/lang/invoke/MethodHandleImpl$3
Transforming java/lang/invoke/MethodHandleImpl$4
Transforming java/lang/ClassValue
Transforming java/lang/ClassValue$Entry
Transforming java/lang/ClassValue$Identity
Transforming java/lang/ClassValue$Version
Transforming java/lang/invoke/MemberName$Factory
Transforming java/lang/invoke/MethodHandleStatics
Transforming java/lang/invoke/MethodHandleStatics$1
Transforming sun/misc/PostVMInitHook
Transforming sun/usagetracker/UsageTrackerClient
Transforming java/util/concurrent/atomic/AtomicBoolean
Transforming sun/usagetracker/UsageTrackerClient$1
Transforming sun/usagetracker/UsageTrackerClient$4
Transforming sun/usagetracker/UsageTrackerClient$2
Transforming java/lang/ProcessEnvironment
Transforming java/lang/ProcessEnvironment$NameComparator
Transforming java/lang/ProcessEnvironment$EntryComparator
Transforming java/util/Collections$UnmodifiableMap
Transforming java/lang/ProcessEnvironment$CheckedEntrySet
Transforming java/util/HashMap$EntrySet
Transforming java/lang/ProcessEnvironment$CheckedEntrySet$1
Transforming java/util/HashMap$EntryIterator
Transforming java/util/HashMap$HashIterator
Transforming java/lang/ProcessEnvironment$CheckedEntry
Transforming sun/usagetracker/UsageTrackerClient$3
Transforming java/io/FileOutputStream$1
Transforming sun/launcher/LauncherHelper
Transforming sun/misc/URLClassPath$FileLoader$1
Transforming Test
Transforming sun/launcher/LauncherHelper$FXHelper
Transforming java/lang/Class$MethodArray
hello world
insert before ......
1492659861901
===============================================
leave myTest and time is :24
Transforming java/lang/Shutdown
Transforming java/lang/Shutdown$Lock
可以看到“leave myTest and time is :24”通过静态代理,动态的更新执行的method的二进制编码,有效的统计方法执行的时间
PS:
如果在动态添加局部变量时出现如下异常
javassist.CannotCompileException: [source error] no such field: startTime
at javassist.CtBehavior.insertAfter(CtBehavior.java:877)
at javassist.CtBehavior.insertAfter(CtBehavior.java:792)
at com.sirding.Perfmonxformer.doMethod(Perfmonxformer.java:49)
at com.sirding.Perfmonxformer.transform(Perfmonxformer.java:27)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Caused by: compile error: no such field: startTime
at javassist.compiler.TypeChecker.fieldAccess(TypeChecker.java:845)
at javassist.compiler.TypeChecker.atFieldRead(TypeChecker.java:803)
at javassist.compiler.TypeChecker.atMember(TypeChecker.java:988)
at javassist.compiler.JvstTypeChecker.atMember(JvstTypeChecker.java:66)
at javassist.compiler.ast.Member.accept(Member.java:39)
at javassist.compiler.TypeChecker.atBinExpr(TypeChecker.java:329)
at javassist.compiler.ast.BinExpr.accept(BinExpr.java:41)
at javassist.compiler.TypeChecker.atPlusExpr(TypeChecker.java:371)
at javassist.compiler.TypeChecker.atBinExpr(TypeChecker.java:312)
at javassist.compiler.ast.BinExpr.accept(BinExpr.java:41)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:221)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:735)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.Javac.compileStmnt(Javac.java:569)
at javassist.CtBehavior.insertAfterAdvice(CtBehavior.java:892)
at javassist.CtBehavior.insertAfter(CtBehavior.java:851)
... 18 more
利用JavaScript进行对象排序,根据用户的年龄排序展示
<script>
var bob={
name;bob,
age:30
}
var peter={
name;peter,
age:30
}
var amy={
name;amy,
age:24
}
var mike={
name;mike,
age:29
}
var john={
FLP
One famous theory in distributed computing, known as FLP after the authors Fischer, Lynch, and Patterson, proved that in a distributed system with asynchronous communication and process crashes,
每一行命令都是用分号(;)作为结束
对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如:
mysql_query("INSERT INTO tablename(first_name,last_name)VALUES('$first_name',$last_name')");
题目链接:zoj 3820 Building Fire Stations
题目大意:给定一棵树,选取两个建立加油站,问说所有点距离加油站距离的最大值的最小值是多少,并且任意输出一种建立加油站的方式。
解题思路:二分距离判断,判断函数的复杂度是o(n),这样的复杂度应该是o(nlogn),即使常数系数偏大,但是居然跑了4.5s,也是醉了。 判断函数里面做了3次bfs,但是每次bfs节点最多