java-java记录
java-java记录
测试工程: https://gitee.com/yangxuan0261/TestGoogle 中的 javalab 模块. (暂时寄放)
前篇
- a
maven 仓库
引入第三方库
引入 json 库为例
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'在 build.gradle 中引入
compile-group:name:version
1
2
3dependencies {
implementation 'org.json:json:20090211'
}然后 sync gradle, 就可以使用了.
Java jar 工具构建
- java打jar包的几种方式详解 - https://www.cnblogs.com/mq0036/p/8566427.html
命令行执行 jar, 包含引用 jar
- java -jar命令运行jar包时指定外部依赖jar包 - https://www.cnblogs.com/exmyth/p/15893890.html
例如执行 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 // macwin32系统每一个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
1049 = 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, 重新编译
执行 jar 是报错没有主清单属性
错误: jar中没有主清单属性
原因是构建 jar 时, 没有配置 入口 class 清单属性
- 解决办法
java sdk 接口暴露
- Java访问控制修饰符详解(public、 private、protected 和 friendly) - http://c.biancheng.net/view/965.html
在 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;
}
}