8000 基础篇部分知识完善 · coderli7/toBeTopJavaer@e583ed9 · GitHub
[go: up one dir, main page]

Skip to content

Commit e583ed9

Browse files
author
hollis.zhl
committed
基础篇部分知识完善
1 parent ce0d4e0 commit e583ed9

File tree

7 files changed

+240
-10
lines changed

7 files changed

+240
-10
lines changed

docs/_sidebar.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,9 @@
235235

236236
* [自定义注解](/basics/java-basic/custom-annotation.md)
237237

238-
* Java中常用注解使用
238+
* [Java中常用注解使用](/basics/java-basic/annotation-in-java.md)
239239

240-
* 注解与反射的结合
240+
* [注解与反射的结合](/basics/java-basic/annotion-and-reflect.md)
241241

242242
* [如何自定义一个注解?](/basics/java-basic/create-annotation.md)
243243

@@ -349,7 +349,7 @@
349349

350350
* [UTF8、UTF16、UTF32区别](/basics/java-basic/UTF8-UTF16-UTF32.md)
351351

352-
* 有了UTF8为什么还需要GBK?
352+
* [有了UTF8为什么还需要GBK?](/basics/java-basic/why-gbk.md)
353353

354354
* [GBK、GB2312、GB18030之间的区别](/basics/java-basic/gbk-gb2312-gb18030.md)
355355

@@ -379,11 +379,11 @@
379379

380380
* Java 8
381381

382-
* lambda表达式
382+
* [lambda表达式](/basics/java-basic/lambda.md)
383383

384384
* [Stream API](/basics/java-basic/stream.md)
385385

386-
* 时间API
386+
* [时间API](/basics/java-basic/time-in-java8.md)
387387

388388
* 阅读源代码
389389

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
3+
@Override 表示当前方法覆盖了父类的方法
4+
5+
@Deprecation 表示方法已经过时,方法上有横线,使用时会有警告。
6+
7+
@SuppressWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)
8+
9+
SafeVarargs (jdk1.7更新) 表示:专门为抑制“堆污染”警告提供的。
10+
11+
@FunctionalInterface (jdk1.8更新) 表示:用来指定某个接口必须是函数式接口,否则就会编译出错。
12+
13+
14+
### Spring常用注解
15+
16+
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
17+
18+
@Scope注解 作用域
19+
20+
@Lazy(true) 表示延迟初始化
21+
22+
@Service用于标注业务层组件
23+
24+
@Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件。
25+
26+
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
27+
28+
@Scope用于指定scope作用域的(用在类上)
29+
30+
@PostConstruct用于指定初始化方法(用在方法上)
31+
32+
@PreDestory用于指定销毁方法(用在方法上)
33+
34+
@DependsOn:定义Bean初始化及销毁时的顺序
35+
36+
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
37+
38+
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
39+
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
40+
41+
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
42+
43+
@PostConstruct 初始化注解
44+
45+
@PreDestroy 摧毁注解 默认 单例 启动就加载
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
注解和反射经常结合在一起使用,在很多框架的代码中都能看到他们结合使用的影子
2+
3+
4+
可以通过反射来判断类,方法,字段上是否有某个注解以及获取注解中的值, 获取某个类中方法上的注解代码示例如下:
5+
6+
```
7+
Class<?> clz = bean.getClass();
8+
Method[] methods = clz.getMethods();
9+
for (Method method : methods) {
10+
if (method.isAnnotationPresent(EnableAuth.class)) {
11+
String name = method.getAnnotation(EnableAuth.class).name();
12+
}
13+
}
14+
```
15+
16+
通过isAnnotationPresent判断是否存在某个注解,通过getAnnotation获取注解对象,然后获取值。
17+
18+
### 示例
19+
20+
示例参考:https://blog.csdn.net/KKALL1314/article/details/96481557
21+
22+
自己写了一个例子,实现功能如下:
23+
24+
一个类的某些字段上被注解标识,在读取该属性时,将注解中的默认值赋给这些属性,没有标记的属性不赋值
25+
26+
```
27+
@Retention(RetentionPolicy.RUNTIME)
28+
@Target(ElementType.FIELD)
29+
@Documented
30+
@Inherited
31+
public @interface MyAnno {
32+
String value() default "有注解";
33+
}
34+
35+
```
36+
37+
定义一个类
38+
39+
```
40+
@Data
41+
@ToString
42+
public class Person {
43+
@MyAnno
44+
private String stra;
45+
private String strb;
46+
private String strc;
47+
48+
public Person(String str1,String str2,String str3){
49+
super();
50+
this.stra = str1;
51+
this.strb = str2;
52+
this.strc = str3;
53+
}
54+
55+
}
56+
57+
```
58+
59+
这里给str1加了注解,并利用反射解析并赋值:
60+
61+
```
62+
public class MyTest {
63+
public static void main(String[] args) {
64+
//初始化全都赋值无注解
65+
Person person = new Person("无注解","无注解","无注解");
66+
//解析注解
67+
doAnnoTest(person);
68+
System.out.println(person.toString());
69+
}
70+
71+
private static void doAnnoTest(Object obj) {
72+
Class clazz = obj.getClass();
73+
Field[] declareFields = clazz.getDeclaredFields();
74+
for (Field field:declareFields) {
75+
//检查该类是否使用了某个注解
76+
if(clazz.isAnnotationPresent(MyAnno.class)){
77+
MyAnno anno = field.getAnnotation(MyAnno.class);
78+
if(anno!=null){
79+
String fieldName = field.getName();
80+
try {
81+
Method setMethod = clazz.getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1),String.class);
82+
//获取注解的属性
83+
String annoValue = anno.value();
84+
//将注解的属性值赋给对应的属性
85+
setMethod.invoke(obj,annoValue);
86+
}catch (NoSuchMethodException e){
87+
e.printStackTrace();
88+
} catch (IllegalAccessException e) {
89+
e.printStackTrace();
90+
} catch (InvocationTargetException e) {
91+
e.printStackTrace();
92+
}
93+
94+
}
95+
}
96+
97+
}
98+
}
99+
100+
}
101+
102+
```
103+
运行结果:
104+
105+
```
106+
107+
Person(stra=有注解, strb=无注解, strc=无注解)
108+
109+
``
110+
111+
当开发者使用了Annotation 修饰了类、方法、Field 等成员之后,这些 Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息。这些处理提取和处理 Annotation 的代码统称为 APT(Annotation Processing Tool)。
112+
113+
注解的提取需要借助于 Java 的反射技术,反射比较慢,所以注解使用时也需要谨慎计较时间成本。

docs/basics/java-basic/lambda.md

111C
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
2+
3+
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
4+
5+
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
6+
7+
### 语法
8+
lambda 表达式的语法格式如下:
9+
```
10+
(parameters) -> expression
11+
12+
(parameters) ->{ statements; }
13+
14+
```
15+
16+
以下是lambda表达式的重要特征:
17+
18+
* 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
19+
* 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
20+
* 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
21+
* 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
22+
23+
### Lambda 表达式实例
24+
25+
```
26+
// 1. 不需要参数,返回值为 5
27+
() -> 5
28+
29+
// 2. 接收一个参数(数字类型),返回其2倍的值
30+
x -> 2 * x
31+
32+
// 3. 接受2个参数(数字),并返回他们的差值
33+
(x, y) -> x – y
34+
35+
// 4. 接收2个int型整数,返回他们的和
36+
(int x, int y) -> x + y
37+
38+
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
39+
(String s) -> System.out.print(s)
40+
41+
```
42+
43+
Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
44+
45+
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
46+
47+
### 变量作用域
48+
49+
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。如以下代码,编译会出错:
50+
51+
```
52+
53+
String first = "";
54+
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());
55+
56+
```
57+
58+
原文地址:https://www.runoob.com/java/java8-lambda-expressions.html

docs/basics/java-basic/time-in-java8.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
2+
3+
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
4+
5+
* 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
6+
7+
* 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
8+
9+
* 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
10+
11+
112
在Java8中, 新的时间及⽇期API位于java.time包中, 该包中有哪些重要的类。 分别代表了什么?
213

314

@@ -19,6 +30,8 @@
1930

2031
`Clock`: 时钟, ⽐如获取⽬前美国纽约的时间
2132

33+
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
34+
2235
### LocalTime 和 LocalDate的区别?
2336

2437

docs/basics/java-basic/why-gbk.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
其实UTF8确实已经是国际通用的字符编码了,但是这种字符标准毕竟是外国定的,而国内也有类似的标准指定组织,也需要制定一套国内通用的标准,于是GBK就诞生了。

docs/menu.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,9 @@ Gitee Pages 完整阅读:[进入](http://hollischuang.gitee.io/tobetopjavaer)
290290

291291
* [自定义注解](/basics/java-basic/custom-annotation.md)
292292

293-
* Java中常用注解使用
293+
* [Java中常用注解使用](/basics/java-basic/annotation-in-java.md)
294294

295-
* 注解与反射的结合
295+
* [注解与反射的结合](/basics/java-basic/annotion-and-reflect.md)
296296

297297
* [如何自定义一个注解?](/basics/java-basic/create-annotation.md)
298298

@@ -404,7 +404,7 @@ Gitee Pages 完整阅读:[进入](http://hollischuang.gitee.io/tobetopjavaer)
404404

405405
* [UTF8、UTF16、UTF32区别](/basics/java-basic/UTF8-UTF16-UTF32.md)
406406

407-
* 有了UTF8为什么还需要GBK?
407+
* [有了UTF8为什么还需要GBK?](/basics/java-basic/why-gbk.md)
408408

409409
* [GBK、GB2312、GB18030之间的区别](/basics/java-basic/gbk-gb2312-gb18030.md)
410410

@@ -434,11 +434,11 @@ Gitee Pages 完整阅读:[进入](http://hollischuang.gitee.io/tobetopjavaer)
434434

435435
* Java 8
436436

437-
* lambda表达式
437+
* [lambda表达式](/basics/java-basic/lambda.md)
438438

439439
* [Stream API](/basics/java-basic/stream.md)
440440

441-
* 时间API
441+
* [时间API](/basics/java-basic/time-in-java8.md)
442442

443443
* 阅读源代码
444444

0 commit comments

Comments
 (0)
0