分类 Java 下的文章

背景

java或android源码中经常会使用移位运算来代替乘除运算,因为移位运算的性能比乘除运算的高(PS:对于计算机而言,移位运算只是移了个位置),所以了解移位运算的计算过程对于我们阅读源码会有一定的帮助。

原码、反码、补码

原码是人脑最容易理解和计算的表示方式

第一位表示符号, 其余位表示值

-1的原码是10000000 00000000 00000000 00000001

反码是人脑无法直观看出其数值的. 通常需要转换成原码在计算其数值

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

-1的反码是11111111 11111111 11111111 11111110

补码是人脑无法直观看出其数值的. 通常需要转换成原码在计算其数值

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

-1的补码是11111111 11111111 11111111 11111111

- 阅读剩余部分 -

来源:https://github.com/Snailclimb/JavaGuide

什么是字节码 采用字节码的最大好处是什么

什么是字节码

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。

采用字节码的最大好处是什么

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

- 阅读剩余部分 -

从字节码角度分析以下几点:

  1. 内部类可以直接访问外部类的private字段和方法;
  2. 非静态内部类持有外部类的引用;
  3. 外部类可以直接访问内部类的private字段和方法(不管是不是静态内部类);

搜索“解释”二字即可从文中得到答案

示例java

package com.fqxyi;

class Test {

    public Test() {
        //用于解释外部类可以直接访问内部类的private字段和方法(不管是不是静态内部类)
        testB();
    }

    private int count;

    private static int count_static;

    public static void main(String[] args) {
        A a = new A();
        a.printA();
    }

    static class A {
        private void printA() {
            //用于解释静态内部类可以直接访问外部类的private字段和方法
            System.out.println("print log --> a count_static = " + count_static);
        }
    }

    private void testB() {
        B b = new B();
        b.printB();
    }

    //用于解释非静态内部类持有外部类的引用
    class B {
        private void printB() {
            //用于解释内部类可以直接访问外部类的private字段和方法
            System.out.println("print log --> b count = " + count);
        }
    }
}

- 阅读剩余部分 -

例子

最近线上报了一个java.lang.UnsatisfiedLinkError的错误,发现环信内部没有将某个loadLibrary方法try catch(error),但是其内部的_loadLibrary方法是try catch(error)的,所以准备做以下修改:
hyphenatechat_3.4.2.jar中的EMClient.class文件中的loadLibrary方法做以下替换:

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        System.loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}

替换为

private static void loadLibrary() {
    if (!libraryLoaded) {
        _loadLibrary("sqlite");
        _loadLibrary("hyphenate_av");
        _loadLibrary("hyphenate_av_recorder");
        _loadLibrary("hyphenate");
        libraryLoaded = true;
    }

}

环境

Windows

需要下载内容


- 阅读剩余部分 -