小编shi*_* xu的帖子

方法调用指令(invokevirtual/invokestatic)由一些意外的指令代替

我一直在调查这个错误整整三天,但仍然没有进展.我希望我能从这里得到一些提示.

我想要做的是使用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)

java jvm bytecode java-bytecode-asm

56
推荐指数
0
解决办法
1081
查看次数

无法在eclipse中关闭编辑器选项卡

我记得当我在Eclipse中单击一个编辑器时,编辑器选项卡的右上角会出现一个十字或最大化图标,如图中右侧的RED框所示.我不知道我做了什么改变,因为关闭图标不再存在(在左边的RED框中),我可能不在乎.

有谁知道如何恢复关闭按钮?我试图重置所有透视图,然后单击左/右按钮,但没有任何改变.Eclipse版本是:

Eclipse IDE for Java Developers版本:Mars.2发行版(4.5.2)构建ID:20160218-0600

截图

java eclipse

10
推荐指数
2
解决办法
6392
查看次数

在ASM的字节码方法内联期间重新映射变量

我正在使用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

8
推荐指数
1
解决办法
1147
查看次数

不安全的defineAnonymousClass和ClassLoader之间的不同行为

我使用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

5
推荐指数
0
解决办法
522
查看次数

该sql是否命中MySql复合索引?

我有一张表: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)

mysql composite-key query-performance

5
推荐指数
1
解决办法
458
查看次数

hadoop安装路径在节点之间是否应该相同

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)

hadoop hdfs

2
推荐指数
1
解决办法
994
查看次数

使用ASM结果修改方法体"在"期间超出最大堆栈大小"

我想用新内容替换方法体(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)

java bytecode bytecode-manipulation java-bytecode-asm

1
推荐指数
1
解决办法
1960
查看次数

错误的堆栈大小由ASM库计算

我使用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)

java bytecode bytecode-manipulation java-bytecode-asm

1
推荐指数
1
解决办法
1177
查看次数

如何将不同的原始数据加载到操作数堆栈

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.

jvm bytecode java-bytecode-asm vm-implementation

1
推荐指数
1
解决办法
612
查看次数