Fork me on GitHub
行锋

低头走路,抬头思考


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索

未命名

发表于 2019-03-24

title: Java反射
tags:

  • java
    copyright: true
    comments: true
    toc: true
    date: 2013-03-23 15:41:51
    categories: java
    password:

来源视频: https://www.imooc.com/video/3725

Class类的使用

  • 在面向对象的世界中,万事万物皆对象。Java中,只有静态的成员和普通数据类型(但是有包装对象)不是对象;
  • Class类是java.lang.Class类的实例对象(There is a class named Class),其构造方法为私有的,只有JVM可以调用
  • 基本数据类型、void都存在类类型,如:Class c1=void.class,Class c2=int.class
  • 任何类都是Class的实例对象,这个实例对象有(如:Food类)3种表现方式:
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
Food food1 = new Food();//Food这个类是Class类的实例对象
//第一种
Class c1 = Food.class;//说明任何类都有一个隐含的静态成员变量class
//第二种:已知道该类的实例对象
Class c2 = food1.getClass();
//第三种
Class c3 = null;
try {
c3 = Class.forName("com.reflect.test.myreflect.Food");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

System.out.println(c1 == c2); //true
System.out.println(c2 == c3); //true

//可以通过类的类类型创建该类的对象实例,但是需要强制转换
//c1.newInstance();
//c2.newInstance();
try {
Food food2 = (Food) c3.newInstance(); //前提:需要有无参数的构造方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

动态加载类:Class类

  • Class.forName(“类的全称”);不仅表示了类的类类型,还表示了动态加载类
  • 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
  • new创建对象时,是静态加载类,在编译时就需要加载所有可能用到的类

反射的操作流程

  1. 获取类的类类型
  2. 通过类的类类型获取方法、属性等相关信息

方法的反射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//获取类的类类型
Class c = object.getClass();
System.out.println(c.getName());
//获取类的方法信息
Method[] ms = c.getMethods();//获取所有public类型的函数,包括父类继承而来的
for (Method method:ms) {
System.out.println(method.getName());
}
System.out.println("======================");
ms = c.getDeclaredMethods();//获取所有该类自己声明的方法,不问访问权限
for (Method method:ms) {
System.out.println(method.getName());
//获取所有方法的参数及类型
//获取参数列表的类类型
Class[] paramsType = method.getParameterTypes();
for (Class paramTypeClass:paramsType) {
System.out.println(paramTypeClass.getName());
}
}

成员变量的反射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//获取类的类类型
Class c = object.getClass();
System.out.println(c.getName());
//获取类的成员变量信息
Field[] fs = c.getFields();//获取所有public类型的成员信息
for (Field field:fs) {
System.out.println(field.getName());
}
System.out.println("======================");
fs = c.getDeclaredFields();//获取所有该类自己声明的成员变量,不问访问权限
for (Field field:fs) {
//获取成员变量类类型名称
Class fieldType = field.getType();
System.out.println(fieldType.getName());
//获取成员变量的名称
System.out.println(field.getName());
}

构造函数的反射

构造方法获取类似:

1
2
c.getDeclaredConstructors();//得到所有构造函数
c.getConstructors();//得到所有public构造函数

方法反射的基本操作

  • 方法的名称和方法的参数列表才能唯一决定某个方法
  1. method.invoke(对象,参数列表 ),如:
1
2
3
//获取方法对象
Method method1 = c.getMethod("add",int.class,int.class);
Object obj = method1.invoke(calc,new Object[]{10,20});Object obj = method1.invoke(food,10,20)

集合范型的本质

  • 反射的操作都是编译之后的操作
  • 编译之后集合的范型是去范型化的,Java中集合的范型是防止错误输入的,只在编译阶段有效,可以通过反射的操作来绕过编译,如:
1
2
3
4
5
6
7
8
List<String> list = new ArrayList<String>();
list.add("hello");
//list.add(100);//编译时报错
//反射方式添加
Class clazz = list.getClass();
Method methodAddOfList = clazz.getMethod("add",Object.class);
methodAddOfList.invoke(list,100);//添加不同类型
System.out.println(list); //[hello, 100]

未命名

发表于 2019-03-24

title: IDEA快捷键
tags:

  • java
    copyright: true
    comments: true
    toc: true
    date: 2019-03-04 09:25:33
    categories: Java
    password:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
Ctrl+Shift + Enter,语句完成
“!”,否定完成,输入表达式时按 “!”键
Ctrl+E,最近的文件
Ctrl+Shift+E,最近更改的文件
Shift+Click,可以关闭文件
Ctrl+[ OR ],可以跑到大括号的开头与结尾
Ctrl+F12,可以显示当前文件的结构
Ctrl+F7,可以查询当前元素在当前文件中的引用,然后按 F3 可以选择
Ctrl+N,可以快速打开类
Ctrl+Shift+N,可以快速打开文件
Alt+Q,可以看到当前方法的声明
Ctrl+P,可以显示参数信息
Ctrl+Shift+Insert,可以选择剪贴板内容并插入
Alt+Insert,可以生成构造器/Getter/Setter等
Ctrl+Alt+V,可以引入变量。例如:new String(); 自动导入变量定义
Ctrl+Alt+T,可以把代码包在一个块内,例如:try/catch
Ctrl+Enter,导入包,自动修正
Ctrl+Alt+L,格式化代码
Ctrl+Alt+I,将选中的代码进行自动缩进编排,这个功能在编辑 JSP 文件时也可以工作
Ctrl+Alt+O,优化导入的类和包
Ctrl+R,替换文本
Ctrl+F,查找文本
Ctrl+Shift+Space,自动补全代码
Ctrl+空格,代码提示(与系统输入法快捷键冲突)
Ctrl+Shift+Alt+N,查找类中的方法或变量
Alt+Shift+C,最近的更改
Alt+Shift+Up/Down,上/下移一行
Shift+F6,重构 – 重命名
Ctrl+X,删除行
Ctrl+D,复制行
Ctrl+/或Ctrl+Shift+/,注释(//或者/**/)
Ctrl+J,自动代码(例如:serr)
Ctrl+Alt+J,用动态模板环绕
Ctrl+H,显示类结构图(类的继承层次)
Ctrl+Q,显示注释文档
Alt+F1,查找代码所在位置
Alt+1,快速打开或隐藏工程面板
Ctrl+Alt+left/right,返回至上次浏览的位置
Alt+left/right,切换代码视图
Alt+Up/Down,在方法间快速移动定位
Ctrl+Shift+Up/Down,向上/下移动语句
F2 或 Shift+F2,高亮错误或警告快速定位
Tab,代码标签输入完成后,按 Tab,生成代码
Ctrl+Shift+F7,高亮显示所有该文本,按 Esc 高亮消失
Alt+F3,逐个往下查找相同文本,并高亮显示
Ctrl+Up/Down,光标中转到第一行或最后一行下
Ctrl+B/Ctrl+Click,快速打开光标处的类或方法(跳转到定义处)
Ctrl+Alt+B,跳转到方法实现处
Ctrl+Shift+Backspace,跳转到上次编辑的地方
Ctrl+O,重写方法
Ctrl+Alt+Space,类名自动完成
Ctrl+Alt+Up/Down,快速跳转搜索结果
Ctrl+Shift+J,整合两行
Alt+F8,计算变量值
Ctrl+Shift+V,可以将最近使用的剪贴板内容选择插入到文本
Ctrl+Alt+Shift+V,简单粘贴
Shift+Esc,不仅可以把焦点移到编辑器上,而且还可以隐藏当前(或最后活动的)工具窗口
F12,把焦点从编辑器移到最近使用的工具窗口
Shift+F1,要打开编辑器光标字符处使用的类或者方法 Java 文档的浏览器
Ctrl+W,可以选择单词继而语句继而行继而函数
Ctrl+Shift+W,取消选择光标所在词
Alt+F7,查找整个工程中使用地某一个类、方法或者变量的位置
Ctrl+I,实现方法
Ctrl+Shift+U,大小写转化
Ctrl+Y,删除当前行


Shift+Enter,向下插入新行
psvm/sout,main/System.out.println(); Ctrl+J,查看更多
Ctrl+Shift+F,全局查找
Ctrl+F,查找/Shift+F3,向上查找/F3,向下查找
Ctrl+Shift+S,高级搜索
Ctrl+U,转到父类
Ctrl+Alt+S,打开设置对话框
Alt+Shift+Inert,开启/关闭列选择模式
Ctrl+Alt+Shift+S,打开当前项目/模块属性
Ctrl+G,定位行
Alt+Home,跳转到导航栏
Ctrl+Enter,上插一行
Ctrl+Backspace,按单词删除
Ctrl+”+/-”,当前方法展开、折叠
Ctrl+Shift+”+/-”,全部展开、折叠
【调试部分、编译】
Ctrl+F2,停止
Alt+Shift+F9,选择 Debug
Alt+Shift+F10,选择 Run
Ctrl+Shift+F9,编译
Ctrl+Shift+F10,运行
Ctrl+Shift+F8,查看断点
F8,步过
F7,步入
Shift+F7,智能步入
Shift+F8,步出
Alt+Shift+F8,强制步过
Alt+Shift+F7,强制步入
Alt+F9,运行至光标处
Ctrl+Alt+F9,强制运行至光标处
F9,恢复程序
Alt+F10,定位到断点
Ctrl+F8,切换行断点
Ctrl+F9,生成项目
Alt+1,项目
Alt+2,收藏
Alt+6,TODO
Alt+7,结构
Ctrl+Shift+C,复制路径
Ctrl+Alt+Shift+C,复制引用,必须选择类名
Ctrl+Alt+Y,同步
Ctrl+~,快速切换方案(界面外观、代码风格、快捷键映射等菜单)
Shift+F12,还原默认布局
Ctrl+Shift+F12,隐藏/恢复所有窗口
Ctrl+F4,关闭
Ctrl+Shift+F4,关闭活动选项卡
Ctrl+Tab,转到下一个拆分器
Ctrl+Shift+Tab,转到上一个拆分器
【重构】
Ctrl+Alt+Shift+T,弹出重构菜单
Shift+F6,重命名
F6,移动
F5,复制
Alt+Delete,安全删除
Ctrl+Alt+N,内联
【查找】
Ctrl+F,查找
Ctrl+R,替换
F3,查找下一个
Shift+F3,查找上一个
Ctrl+Shift+F,在路径中查找
Ctrl+Shift+R,在路径中替换
Ctrl+Shift+S,搜索结构
Ctrl+Shift+M,替换结构
Alt+F7,查找用法
Ctrl+Alt+F7,显示用法
Ctrl+F7,在文件中查找用法
Ctrl+Shift+F7,在文件中高亮显示用法

https://www.cnblogs.com/mithrandirw/p/8819314.html

LDAP

发表于 2019-03-24 | 分类于 Java

https://www.cnblogs.com/yangykaifa/p/6773577.html
https://blog.csdn.net/qq_27384769/article/details/79439645
http://www.imooc.com/article/254611
https://blog.csdn.net/qq_27376871/article/details/51163337

Spring入门

发表于 2019-03-24 | 分类于 Spring

https://www.imooc.com/learn/196
https://www.imooc.com/learn/1108
https://www.imooc.com/learn/869

https://www.imooc.com/learn/47

未命名

发表于 2019-03-19

title: SourceTree基本使用.md
tags:

  • 工具
    copyright: true
    comments: true
    toc: true
    date: 2019-03-19 15:29:55
    categories: 工具
    password:

https://www.cnblogs.com/tian-xie/p/6264104.html

下载

历史版本:https://mac.filehorse.com/download-sourcetree/old-versions/

未命名

发表于 2019-03-11

title: Mockito入门
tags:

  • java
    copyright: true
    comments: true
    toc: true
    date: 2019-02-20 21:25:33
    categories: Java
    password:

Mockito简介

  • 官网:https://site.mockito.org/
  • 中文文档:https://github.com/hehonghui/mockito-doc-zh/blob/master/README.md#0
  • 英文文档:https://www.vogella.com/tutorials/Mockito/article.html
  • Mock:(mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象
  • Mockito是mocking框架,它让你用简洁的API做测试,是GitHub上使用最广泛的Mock框架,并与JUnit结合使用
  • Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发

maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>2.0.2-beta</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

参考文章

  • https://www.jianshu.com/p/7d602a9f85e3
  • https://blog.csdn.net/xiang__liu/article/details/81147933

Swagger入门

发表于 2019-03-10 | 分类于 Java

简介

https://swagger.io/
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务

基本使用使用

  1. 添加maven依赖
1
2
3
4
5
6
7
8
9
10
11
<!-- swagger RESTful API 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
  1. 添加Swagger配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi() {

ApiInfo apiInfo = new ApiInfoBuilder()
.title("测试Swagger项目接口文档")
.description("测试Swagger项目接口文档,符合RESTful API。")
.version("1.0")
.build();

return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo) //api的标题、描述、版本等信息
.select() // 选择那些路径和api会生成document
.apis(RequestHandlerSelectors.basePackage("com.test.controller")) //以扫描包的方式
.paths(PathSelectors.any())
.build();
}
}
  1. 创建接口类
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
@Api(value = "用户模块")
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 获取单个用户
*
* @param id
* @return
*/
@ApiOperation(value = "获取单个用户", notes = "传入id获取单个用户")
// @ApiImplicitParam(name = "id", value = "用户id", required = true, paramType = "path", dataType = "Long") //注意:paramType需要指定为path,不然不能正常获取
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String user(@ApiParam(value = "用户Id", required = true) @PathVariable Long id) {
return "user id :" + id;
}

/**
* 获取用户列表
*
* @return
*/
@ApiOperation(value = "获取用户列表", notes = "获取用户列表")
@RequestMapping(value = "", method = RequestMethod.GET)
public List list() {
List list = new ArrayList();
list.add("Sam1");
list.add("Sam2");
list.add("Sam3");
return list;
}

/**
* 新建用户
*
* @param user
* @return
*/
@ApiOperation(value = "新建用户", notes = "新建一个用户")
// @ApiImplicitParams({
//注意:paramType需要指定为body
// @ApiImplicitParam(name = "user", value = "用户数据", required = true, paramType = "body", dataType = "User")
// })
@RequestMapping(value = "", method = RequestMethod.POST)
public String create(@ApiParam(value = "用户数据", required = true) @RequestBody User user) {
System.out.println("user : " + user.getName() + " " + user.getAge());
return "success 新建user : " + user.getName() + " " + user.getAge();
}


/**
* 删除用户
*
* @return
*/
@ApiOperation(value = "删除用户", notes = "通过用户id删除用户")
@ApiImplicitParam(name = "id", value = "用户id", required = true, paramType = "path", dataType = "Long")
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable Long id) {
System.out.println("删除用户:" + id);
return "success 删除user" + id;
}


/**
* 更新用户
*
* @return
*/
@ApiOperation(value = "更新用户", notes = "更新已存在用户")
@ApiImplicitParam(name = "user", value = "用户数据", required = true, paramType = "body", dataType = "User")
@RequestMapping(value = "", method = RequestMethod.PUT)
public String update(@RequestBody User user) {
System.out.println("更新用户:" + user.getId() + " " + user.getName() + " " + user.getAge());
return "success 更新user : " + user.getId() + " " + user.getName() + " " + user.getAge();
}
}
  1. 启动SpringBoot项目,访问 http://localhost:8080/swagger-ui.html 查看效果
    image

Swagger2注解

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
@EnableSwagger2:表示开启Swagger2  
@ApiParam:单个参数描述
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API
@ApiError :发生错误返回的信息

@Api:用在请求的类上,表示对类的说明
tags="说明该类的作用,可以在UI界面上看到的注解"
value="该参数没什么意义,在UI界面上也看到,所以不需要配置"

@ApiOperation:用在请求的方法上,说明方法的用途、作用
value="说明方法的用途、作用"
notes="方法的备注说明"

@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
name:参数名
value:参数的汉字说明、解释
required:参数是否必须传
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query --> 请求参数的获取:@RequestParam
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
dataType:参数类型,默认String,其它值dataType="Integer"
defaultValue:参数的默认值

@ApiResponses:用在请求的方法上,表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类

@ApiModel:用于响应类上,表示一个返回响应数据的信息
(这种一般用在post创建的时候,使用@RequestBody这样的场景,
请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:用在属性上,描述响应类的属性

参考文章:

  • https://blog.csdn.net/qq_32506963/article/details/82911455
  • http://www.cnblogs.com/jtlgb/p/8532433.html

Java常见异常记录

发表于 2019-03-07 | 分类于 Java
  1. log4j
    ~~
    log4j:WARN No appenders could be found for logger
    log4j:WARN Please initialize the log4j system properly.
1
添加log4j.properties在resources文件夹下,内容类似:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

Java常用技术网址收集

发表于 2019-03-06 | 分类于 Java

Guava

https://www.yiibai.com/guava/

未命名

发表于 2019-03-06

title: Linux下pid文件说明
tags:

  • Linux
    copyright: true
    comments: true
    toc: true
    date: 2019-03-06 08:25:33
    categories: Linux
    password:

Linux下的pid文件位于:/var/run/目录下

  • 内容:内容只有一行,记录了该进程的ID
  • 作用:防止启动多个进程副本
  • 原理:进程运行后会给.pid文件加一个文件锁,只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出
123…50
行锋

行锋

496 日志
15 分类
74 标签
GitHub E-Mail
自古写字楼如青楼,不许楼里见白头
© 2015 — 2019 行锋
博客全站共229.9k字