java-java记录

java-java记录

测试工程: https://gitee.com/yangxuan0261/TestGoogle 中的 javalab 模块. (暂时寄放)


前篇

  • a

maven 仓库


引入第三方库

引入 json 库为例

  1. maven 仓库: https://mvnrepository.com/artifact/org.json/json/20090211

    点击在 gradle 页签就会看到

    1
    2
    // https://mvnrepository.com/artifact/org.json/json
    compile group: 'org.json', name: 'json', version: '20090211'
  2. build.gradle 中引入 compile-group:name:version

    1
    2
    3
    dependencies {
    implementation 'org.json:json:20090211'
    }

    然后 sync gradle, 就可以使用了.


Java jar 工具构建


命令行执行 jar, 包含引用 jar

  • 例如执行 test.jar, 引用了 ref01.jar 和 ref02.jar

    1
    2
    $ java -Xbootclasspath/a:ref01.jar;ref02.jar; -jar test.jar // win
    $ java -Xbootclasspath/a:ref01.jar:ref02.jar: -jar test.jar // mac

    win32系统每一个jar用分号隔开,unix系统下用冒号隔开


踩坑

编译 java 源文件中文报错

  • 错误: 错误: 编码GBK的不可映射字符

  • 原因: 代码里面有中文, 编译命令中加入 -encoding UTF-8

    1
    $ javac -encoding UTF-8 AppMain.java

执行 jar 报错版本不兼容

  • 错误: Exception in thread "main" java.lang.UnsupportedClassVersionError: com/jared/AppMain has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

  • 版本对应表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    49 = Java 5
    50 = Java 6
    51 = Java 7
    52 = Java 8
    53 = Java 9
    54 = Java 10
    55 = Java 11
    56 = Java 12
    57 = Java 13
    58 = Java 14
  • 将编译的 sdk 设置为 java 8 即可

    file -> project structure -> project, 设置 sdk 为 1.8, 重新编译

    image-20220930142407582


执行 jar 是报错没有主清单属性

错误: jar中没有主清单属性

原因是构建 jar 时, 没有配置 入口 class 清单属性

  • 解决办法

java sdk 接口暴露

  • 在 sdk 中, 定义需要暴露 类/方法 定义成 public 即可, 未定义 public 的只能同个 package 内访问

    类可以用修饰符 public声明, 在这种情况下,类对所有类都可见。如果一个类没有修饰符(默认, 种访问特性又称为包访问性(package private)), 它只在自
    己的包中可见。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
        // TestApi02.java
    package com.yang.androidaar;
    public class TestApi01 {
    public void Say() {
    LogUtil.D("--- TestApi01.Say");
    }
    public void Walk() {
    LogUtil.D("--- TestApi01.Walk");
    }
    void Run() {
    LogUtil.D("--- TestApi01.Run");
    }
    }


    // TestApi02.java
    package com.yang.androidaar;
    class TestApi02 {
    public void Say() {
    LogUtil.D("--- TestApi02.Say");
    }
    }

    - 效果

    ![image-20231011103114553](https://pic05.wilker.cn/20231011103136-427.webp)

    - 接口也是一样

    ![image-20231011110051130](https://pic05.wilker.cn/20231011110055-857.webp)



    ---

    ### 多线程单例安全

    - 线程的同步之Synchronized在单例模式中的应用 - https://www.cnblogs.com/meet/p/5290948.html

    ```java
    /懒汉式的单例类
    class MyJvm{
    private static MyJvm instance = null;
    private MyJvm(){}
    public static MyJvm getInstance(){
    if (instance == null) { // 第1个线程进来会进入锁然后创建对象,第2个线程再走到这的时候已经不会再进入同步块不会出现锁等待了
    synchronized(MyJvm.class){ //静态方法里没有this,所以只能锁定类的字节码信息
    if (instance == null) { // 进一步判断是否为 null
    instance = new MyJvm();
    }
    }
    }
    return instance;
    }
    }