Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
阿啄debugIT
transmittable-thread-local
提交
3b33897c
T
transmittable-thread-local
项目概览
阿啄debugIT
/
transmittable-thread-local
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
transmittable-thread-local
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3b33897c
编写于
10月 25, 2018
作者:
oldratlee
🔥
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
extract javassist util method doTryFinallyForMethod
上级
79613478
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
49 addition
and
41 deletion
+49
-41
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java
...t/internal/transformlet/impl/TtlForkJoinTransformlet.java
+9
-23
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlTimerTaskTransformlet.java
.../internal/transformlet/impl/TtlTimerTaskTransformlet.java
+4
-18
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java
...tl/threadpool/agent/internal/transformlet/impl/Utils.java
+36
-0
未找到文件。
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java
浏览文件 @
3b33897c
...
@@ -5,10 +5,8 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransform
...
@@ -5,10 +5,8 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransform
import
javassist.*
;
import
javassist.*
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.lang.reflect.Modifier
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
getCtClass
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.*;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
signatureOfMethod
;
/**
/**
* TTL {@link JavassistTransformlet} for {@link java.util.concurrent.ForkJoinTask}.
* TTL {@link JavassistTransformlet} for {@link java.util.concurrent.ForkJoinTask}.
...
@@ -45,27 +43,15 @@ public class TtlForkJoinTransformlet implements JavassistTransformlet {
...
@@ -45,27 +43,15 @@ public class TtlForkJoinTransformlet implements JavassistTransformlet {
logger
.
info
(
"add new field "
+
capturedFieldName
+
" to class "
+
className
);
logger
.
info
(
"add new field "
+
capturedFieldName
+
" to class "
+
className
);
final
CtMethod
doExecMethod
=
clazz
.
getDeclaredMethod
(
"doExec"
,
new
CtClass
[
0
]);
final
CtMethod
doExecMethod
=
clazz
.
getDeclaredMethod
(
"doExec"
,
new
CtClass
[
0
]);
final
CtMethod
new_doExecMethod
=
CtNewMethod
.
copy
(
doExecMethod
,
clazz
,
null
);
final
String
original_doExec_method_rename
=
renamedMethodNameByTtl
(
doExecMethod
);
// rename original doExec method, and set to private method(avoid reflect out renamed method unexpectedly)
final
String
beforeCode
=
"if (this instanceof "
+
TTL_RECURSIVE_ACTION_CLASS_NAME
+
" || this instanceof "
+
TTL_RECURSIVE_TASK_CLASS_NAME
+
") {\n"
+
final
String
original_doExec_method_rename
=
"original$"
+
doExecMethod
.
getName
()+
"$method$renamed$by$ttl"
;
" return "
+
original_doExec_method_rename
+
"($$);\n"
+
// do nothing/directly return, if is TTL ForkJoinTask instance
doExecMethod
.
setName
(
original_doExec_method_rename
);
doExecMethod
.
setModifiers
(
doExecMethod
.
getModifiers
()
&
~
Modifier
.
PUBLIC
/* remove public */
|
Modifier
.
PRIVATE
/* add private */
);
// set new doExec method implementation
final
String
code
=
"{\n"
+
// do nothing/directly return, if is TTL ForkJoinTask instance
"if (this instanceof "
+
TTL_RECURSIVE_ACTION_CLASS_NAME
+
" || this instanceof "
+
TTL_RECURSIVE_TASK_CLASS_NAME
+
") {\n"
+
" return "
+
original_doExec_method_rename
+
"($$);\n"
+
"}\n"
+
"}\n"
+
"Object backup = com.alibaba.ttl.TransmittableThreadLocal.Transmitter.replay("
+
capturedFieldName
+
");\n"
+
"Object backup = com.alibaba.ttl.TransmittableThreadLocal.Transmitter.replay("
+
capturedFieldName
+
");"
;
"try {\n"
+
" return "
+
original_doExec_method_rename
+
"($$);\n"
+
final
String
finallyCode
=
"com.alibaba.ttl.TransmittableThreadLocal.Transmitter.restore(backup);"
;
"} finally {\n"
+
" com.alibaba.ttl.TransmittableThreadLocal.Transmitter.restore(backup);\n"
+
doTryFinallyForMethod
(
doExecMethod
,
original_doExec_method_rename
,
beforeCode
,
finallyCode
);
"}\n"
+
"}"
;
new_doExecMethod
.
setBody
(
code
);
clazz
.
addMethod
(
new_doExecMethod
);
logger
.
info
(
"insert code around method "
+
signatureOfMethod
(
doExecMethod
)
+
" of class "
+
className
+
": "
+
code
);
}
}
}
}
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlTimerTaskTransformlet.java
浏览文件 @
3b33897c
...
@@ -5,10 +5,9 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransform
...
@@ -5,10 +5,9 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransform
import
javassist.*
;
import
javassist.*
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.lang.reflect.Modifier
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
doTryFinallyForMethod
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
getCtClass
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
getCtClass
;
import
static
com
.
alibaba
.
ttl
.
threadpool
.
agent
.
internal
.
transformlet
.
impl
.
Utils
.
signatureOfMethod
;
/**
/**
* TTL {@link JavassistTransformlet} for {@link java.util.TimerTask}.
* TTL {@link JavassistTransformlet} for {@link java.util.TimerTask}.
...
@@ -58,23 +57,10 @@ public class TtlTimerTaskTransformlet implements JavassistTransformlet {
...
@@ -58,23 +57,10 @@ public class TtlTimerTaskTransformlet implements JavassistTransformlet {
logger
.
info
(
"add new field "
+
capturedFieldName
+
" to class "
+
className
);
logger
.
info
(
"add new field "
+
capturedFieldName
+
" to class "
+
className
);
final
CtMethod
runMethod
=
clazz
.
getDeclaredMethod
(
RUN_METHOD_NAME
,
new
CtClass
[
0
]);
final
CtMethod
runMethod
=
clazz
.
getDeclaredMethod
(
RUN_METHOD_NAME
,
new
CtClass
[
0
]);
final
CtMethod
new_runMethod
=
CtNewMethod
.
copy
(
runMethod
,
clazz
,
null
);
// rename original run method, and set to private method(avoid reflect out renamed method unexpectedly)
final
String
beforeCode
=
"Object backup = com.alibaba.ttl.TransmittableThreadLocal.Transmitter.replay("
+
capturedFieldName
+
");"
;
final
String
original_run_method_rename
=
"original$"
+
runMethod
.
getName
()
+
"$method$renamed$by$ttl"
;
final
String
finallyCode
=
"com.alibaba.ttl.TransmittableThreadLocal.Transmitter.restore(backup);"
;
runMethod
.
setName
(
original_run_method_rename
);
runMethod
.
setModifiers
(
runMethod
.
getModifiers
()
&
~
Modifier
.
PUBLIC
/* remove public */
|
Modifier
.
PRIVATE
/* add private */
);
// set new run method implementation
doTryFinallyForMethod
(
runMethod
,
beforeCode
,
finallyCode
);
final
String
code
=
"{\n"
+
"Object backup = com.alibaba.ttl.TransmittableThreadLocal.Transmitter.replay("
+
capturedFieldName
+
");\n"
+
"try {\n"
+
" return "
+
original_run_method_rename
+
"($$);\n"
+
"} finally {\n"
+
" com.alibaba.ttl.TransmittableThreadLocal.Transmitter.restore(backup);\n"
+
"}\n"
+
"}"
;
new_runMethod
.
setBody
(
code
);
clazz
.
addMethod
(
new_runMethod
);
logger
.
info
(
"insert code around method "
+
signatureOfMethod
(
runMethod
)
+
" of class "
+
className
+
": "
+
code
);
}
}
}
}
src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java
浏览文件 @
3b33897c
package
com.alibaba.ttl.threadpool.agent.internal.transformlet.impl
;
package
com.alibaba.ttl.threadpool.agent.internal.transformlet.impl
;
import
com.alibaba.ttl.threadpool.agent.internal.logging.Logger
;
import
javassist.*
;
import
javassist.*
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayInputStream
;
...
@@ -11,6 +12,8 @@ import java.lang.reflect.Modifier;
...
@@ -11,6 +12,8 @@ import java.lang.reflect.Modifier;
* @since 2.6.0
* @since 2.6.0
*/
*/
class
Utils
{
class
Utils
{
private
static
final
Logger
logger
=
Logger
.
getLogger
(
Utils
.
class
);
/**
/**
* String like {@code ScheduledFuture scheduleAtFixedRate(Runnable, long, long, TimeUnit)}
* String like {@code ScheduledFuture scheduleAtFixedRate(Runnable, long, long, TimeUnit)}
* for {@link java.util.concurrent.ScheduledThreadPoolExecutor#scheduleAtFixedRate}.
* for {@link java.util.concurrent.ScheduledThreadPoolExecutor#scheduleAtFixedRate}.
...
@@ -50,4 +53,37 @@ class Utils {
...
@@ -50,4 +53,37 @@ class Utils {
clazz
.
defrost
();
clazz
.
defrost
();
return
clazz
;
return
clazz
;
}
}
static
String
renamedMethodNameByTtl
(
CtMethod
method
)
{
return
"original$"
+
method
.
getName
()
+
"$method$renamed$by$ttl"
;
}
static
void
doTryFinallyForMethod
(
CtMethod
method
,
String
beforeCode
,
String
finallyCode
)
throws
CannotCompileException
,
NotFoundException
{
doTryFinallyForMethod
(
method
,
renamedMethodNameByTtl
(
method
),
beforeCode
,
finallyCode
);
}
static
void
doTryFinallyForMethod
(
CtMethod
method
,
String
originalMethodRename
,
String
beforeCode
,
String
finallyCode
)
throws
CannotCompileException
,
NotFoundException
{
final
CtClass
clazz
=
method
.
getDeclaringClass
();
final
CtMethod
new_method
=
CtNewMethod
.
copy
(
method
,
clazz
,
null
);
// rename original method, and set to private method(avoid reflect out renamed method unexpectedly)
method
.
setName
(
originalMethodRename
);
method
.
setModifiers
(
method
.
getModifiers
()
&
~
Modifier
.
PUBLIC
/* remove public */
&
~
Modifier
.
PROTECTED
/* remove protected */
|
Modifier
.
PRIVATE
/* add private */
);
// set new method implementation
final
String
code
=
"{\n"
+
beforeCode
+
"\n"
+
"try {\n"
+
" return "
+
originalMethodRename
+
"($$);\n"
+
"} finally {\n"
+
" "
+
finallyCode
+
"\n"
+
"} }"
;
new_method
.
setBody
(
code
);
clazz
.
addMethod
(
new_method
);
logger
.
info
(
"insert code around method "
+
signatureOfMethod
(
method
)
+
" of class "
+
clazz
.
getName
()
+
": "
+
code
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录