我一直在调查这个错误整整三天,但仍然没有进展.我希望我能从这里得到一些提示.
我想要做的是使用ASM库将MethodNode内联到MethodHandle调用站点(#5,#17和#30).为简化起见,#5处的MethodHandle引用静态方法static Functions.isFooString(String)boolen.
在呼叫站点,内联之前的指令就像
//Before
stack=3, locals=3, args_size=3
0: aload_0
1: getfield #15 // Field guard:Ljava/lang/invoke/MethodHandle;
4: aload_1
5: invokevirtual #29 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;)Z
8: ifeq 24
11: aload_0
12: getfield #17 // Field trueTarget:Ljava/lang/invoke/MethodHandle;
15: aload_1
16: aload_2
17: invokevirtual #31 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
20: checkcast #33 // class java/lang/String
23: areturn
24: aload_0
25: getfield #19 // Field falseTarget:Ljava/lang/invoke/MethodHandle;
28: aload_1
29: aload_2
30: invokevirtual #31 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
33: checkcast #33 // class java/lang/String
36: …Run Code Online (Sandbox Code Playgroud) 我记得当我在Eclipse中单击一个编辑器时,编辑器选项卡的右上角会出现一个十字或最大化图标,如图中右侧的RED框所示.我不知道我做了什么改变,因为关闭图标不再存在(在左边的RED框中),我可能不在乎.
有谁知道如何恢复关闭按钮?我试图重置所有透视图,然后单击左/右按钮,但没有任何改变.Eclipse版本是:
Eclipse IDE for Java Developers版本:Mars.2发行版(4.5.2)构建ID:20160218-0600
我正在使用ASM进行在线字节码方法内联优化.我的更改基于示例3.2.6 Inline Method(http://asm.ow2.org/current/asm-transformations.pdf).测试示例(在Caller :: test中内联被调用者的计算(int,int))是:
public class Caller {
final Callee _callee;
public Caller(Callee callee){
_callee = callee;
}
public static void main(String[] args) {
new Caller(new Callee("xu", "shijie")).test(5, 100);
}
public void test(int a, int b){
int t = a;
int p = b;
int r = t+p-_callee.calculate(a, b);
int m = t-p;
System.out.println(t);
}
}
public class Callee {
final String _a;
final String _b;
public Callee(String a, String b){
_a = a;
_b …Run Code Online (Sandbox Code Playgroud) java bytecode inline bytecode-manipulation java-bytecode-asm
我使用classloader和Unsafe :: definedAnonymous()来加载生成的字节码byte [].classLoader.loadClass()返回的Class的使用成功,而它c.getMethod()在哪个c=Unsafe.defineAnonymousClass()API中失败.那么生成的字节码是错的吗?
我的代码:
MainInliner loader = new MainInliner();
Class<?> c =null;
byte[] bytes = ...
if(args[0].equals("0")){
c = loader.loadClass(name, bytes, 0, bytes.length); // Classloader.loadClass.
}else{
c = Unsafe.defineAnonymousClass(Hoster, bytes, null);
}
Method m = c.getMethod("main", new Class<?>[] { String[].class });
Run Code Online (Sandbox Code Playgroud)
错误是:
Exception Details:
Location:
code/sxu/asm/example/Caller.test(II)V @98: lload_3
Reason:
Type integer (current frame, locals[3]) is not assignable to long
Current Frame:
bci: @98
flags: { }
locals: { 'code/sxu/asm/example/Caller', integer, integer, integer, integer, integer, integer, …Run Code Online (Sandbox Code Playgroud) java classloader dynamic-class-loaders bytecode-manipulation java-bytecode-asm
我有一张表:student_homework,其复合索引之一是uk_sid_lsnid_version(student_id, lesson_id, curriculum_version, type):
student_homework 0 uk_sid_lsnid_version 1 student_id A 100 BTREE
student_homework 0 uk_sid_lsnid_version 2 lesson_id A 100 BTREE
student_homework 0 uk_sid_lsnid_version 3 curriculum_version A 100 BTREE
student_homework 0 uk_sid_lsnid_version 4 type A 100 BTREE
Run Code Online (Sandbox Code Playgroud)
现在我有一个 Sql:
select * from student_homework where student_id=100 and type=1结果explain如下:
1 SIMPLE student_homework ref uk_sid_lsnid_version,idx_student_id_update_time uk_sid_lsnid_version 4 const 20 10.0 Using index condition
Run Code Online (Sandbox Code Playgroud)
执行计划是uk_sid_lsnid_version。
我的问题是查询条件type在这里如何工作?数据库引擎是否扫描所有(缩小的)记录?根据我的理解,树形层次结构是:
student_id
/ \
lesson_id lesson_id
/ \
curriculum_version curriculum_version
/ …Run Code Online (Sandbox Code Playgroud) Hadoop 2.7安装在/opt/pro/hadoop/hadoop-2.7.3master上,然后将整个安装复制到slave上,但目录不同/opt/pro/hadoop-2.7.3。然后,我更新从机上的环境变量(例如,HADOOP_HOME、namenode 和 datanode 的 hdfs_site.xml)。
现在我可以hadoop version成功地在slave上运行了。但是,在主服务器中,start-dfs.sh失败并显示消息:
17/02/18 10:24:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [master]
master: starting namenode, logging to /opt/pro/hadoop/hadoop-2.7.3/logs/hadoop-shijiex-namenode-shijie-ThinkPad-T410.out
master: starting datanode, logging to /opt/pro/hadoop/hadoop-2.7.3/logs/hadoop-shijiex-datanode-shijie-ThinkPad-T410.out
slave: bash: line 0: cd: /opt/pro/hadoop/hadoop-2.7.3: No such file or directory
slave: bash: /opt/pro/hadoop/hadoop-2.7.3/sbin/hadoop-daemon.sh: No such file or directory
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/pro/hadoop/hadoop-2.7.3/logs/hadoop-shijiex-secondarynamenode-shijie-ThinkPad-T410.out
17/02/18 10:26:15 …Run Code Online (Sandbox Code Playgroud) 我想用新内容替换方法体(sample.class:sayHello方法),然后执行sample.class.原来的sayHelo声明是:
public int sayHello(String args){
}
Run Code Online (Sandbox Code Playgroud)
我想修改它的主体:
System.out.println("sxu says: hello world!");
return 1;
Run Code Online (Sandbox Code Playgroud)
但是样例执行结果抛出异常:
Exception in thread "main" java.lang.VerifyError: Operand stack overflow
Exception Details:
Location:
code/sxu/demo/data/sample.sayHello(Ljava/lang/String;)I @4: ldc
Reason:
Exceeded max stack size.
Current Frame:
bci: @4
flags: { }
locals: { 'code/sxu/demo/data/sample', 'java/lang/String' }
stack: { 'code/sxu/demo/data/sample', 'java/io/PrintStream' }
Bytecode:
0000000: 2ab2 0028 122a b600 1704 acb2 0028 2bb6
0000010: 0017 04ac
Run Code Online (Sandbox Code Playgroud)
我使用asm工具,我的代码中有三个java类:
public class Adapt extends ClassLoader {
@Override
protected synchronized Class<?> loadClass(final String name,
final boolean resolve) …Run Code Online (Sandbox Code Playgroud) 我使用ASM库生成字节码,并且方法的"最大堆栈大小"将自动计算.在运行期间,我发现此值(最大堆栈大小)不正确.
我的源代码是:
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
....
MethodType initType = MethodType.methodType(void.class, clsList);
mv = cw.visitMethod(ACC_PUBLIC, "<init>", initType.toMethodDescriptorString(), null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/invoke/BaseTemplate", "<init>", "()V", false);
for(int i=0; i< list.size(); i++){
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1+i);
mv.visitFieldInsn(PUTFIELD, className, list.get(i).name(), Utils.getFieldDesc(list.get(i).type()));
}
mv.visitInsn(RETURN);
//mv.visitMaxs(2, 4); //Verify succeeds if uncomment this line.
mv.visitEnd();
....
//Verify generated code before class loading..
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
Class<?> expClass =defineClass(..);
Run Code Online (Sandbox Code Playgroud)
上面的代码将生成字节码:
Classfile /C:/temp/TGWD.class
Last modified Mar 11, 2015; size …Run Code Online (Sandbox Code Playgroud) JVM有两条指令:( bipush操作数值应介于Byte.MIN_VALUE和之间Byte.MAX_VALUE.)和sipush(操作数值应介于Short.MIN_VALUE和之间Short.MAX_VALUE).相应地,MethodVisitorASM中提供API来操作这两个指令:
public void visitIntInsn(int opcode, int operand)
Run Code Online (Sandbox Code Playgroud)
因此,如何访问ASM中的其他非字节(短)基元?例如,原语long,double,int,boolean,和float数据?这看起来很奇怪,这些数据被封装为Long,Double,Integer.