学java!!!

Posted by Joel on March 10,2018

proxy:local启动流程

  1. 前端:koa服务器,proxy转发请求到8090端口
  2. 8090开启一个nginx服务器,作为反向代理服务器,根据路径将请求转发到不同端口,例:8080
  3. 8080端口运行TOMCAT服务,返回资源。

java注解

元注解

元注解就是用来注解注解的注解(绕口令)

Retention

它的取值如下:

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
Documented

能否将注解中的内容包含到javadoc

Target

指定了注解运用的地方。

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
Inherited

子类能否继承父类的注解

Repeatable

重复使用注解

注解的属性

注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

默认值由default指定

1
2
3
4
public @interface TestAnnotation {
String name() default "jack";
int id() default 1;
}

如果仅有一个名为value的属性,赋值时可以直接写。

使用方法

1
2
3
4
@TestAnnotation(name="jack", id=1)
public class Test {

}

空注解可以省略括号。

定义注解步骤

  1. 用@interface定义注解
  2. 用元注解修饰注解,target必须,retention一般为runtime,inheritable、repeatable一般不需要
  3. 定义注解参数和默认值

DAO是什么

Data Access Object,数据访问对象。

是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。通过映射应用程序对持久层的调用,DAO提供一些特定的数据操作,而无需暴露数据库细节。

Service

Service,我们有时候会需要一些相对独立,与业务系统没啥关系的功能。但不是所有的功能都可以做成一个服务,服务是一个相对独立的功能模块,完成一些指定的工作,这些工作高度抽象和通用。一个典型的服务像是数据库服务、缓存服务、文件存储服务、身份验证服务、消息队列服务等。

服务的特征:抽象、独立、稳定。

Controller

Controller业务流程

idea坑爹,resource不build

解决方案

bean?

一种符合规范的java类

  1. 这个类需要是public 的, 然后需要有个无参数的构造函数

  2. 这个类的属性应该是private 的, 通过setXXX()和getXXX()来访问

  3. 我们得提供一个所谓的自省/反射机制, 这样能在运行时查看java bean 的各种信息

  4. 这个类应该是可以序列化的, 即可以把bean的状态保存的硬盘上, 以便以后来恢复。

@Autowired

自动注入,在上下文中查找符合的bean并注入

sql

select

1
2
3
SELECT [DISTINCT] <列名>, ...
FROM <表名>
WHERE <条件表达式>;

update

1
2
3
UPDATE <表名>
SET (<列名>,...) = (<表达式>,...)
WHERE <条件表达式>;

乱七八糟的对象

DAO(data access object)数据访问对象,此对象用于访问数据库, 提供数据库的CRUD操作…

DTO(data transfer object)数据传输对象,向前端传输数据的对象。

DVO(value object)值对象,用于业务层数据传递,也可以与DTO混用

多态?

  • 调用方法时动态的调用实际类型的方法,而不是声明的变量的类型的方法
  • 即可能调用的是子类的覆写方法

final修饰符?

final,最终,按我的理解,多态中说到调用方法是运行时才确定真正的方法,那么final修饰符就是直接指定了这个方法。

  • 修饰方法,方法不能被覆写
  • 修饰属性,属性的值初始化后就不能改变
  • 修饰类,类不能被继承

转型?

向上转型:转为更加抽象的类型

向下转型:转为更加具体的类型

Class?class? 傻傻分不清楚

Class是所有类的数据类型。

可以这么理解,Java中有基础数据类型:int、float等,其他的都是类,那么类的数据类型是什么?就是Class。

当声明一个类时,我们创建了一个Class的实例

如何获取Class实例?

  • Type.class
  • getClass()
  • Class.forName()

Field

通过Class实例获取Field实例
  • getField(name)/getFields():获取public的字段,含父类
  • getDeclaredField(name)/getDeclaredFields():获取当前类所有字段,不含父类
通过Field实例获取字段信息
  • getName
  • getType
  • getModifiers
通过Field实例读取/设置字段值
  • get(obj)
  • set(obj, val)

privite修饰的字段可以用setAccessible(true)设置为可访问。

Method

通过Class实例获取Method

与Field类似

通过Method实例获取方法信息
  • getName
  • getReturnType
  • getParameterType
  • getModifiers
通过Method实例调用方法
  • invoke(obj)
  • invoke(obj, args…)

privite修饰的方法可以用setAccessible(true)设置为可访问。

Constructor

通过Class实例获取Constructor

与Field类似,无父类的Constructor

privite修饰的Constructor可以用setAccessible(true)设置为可访问。

其他

  • getSuperClass:获取父类,Object、interface返回null
  • getInterfaces:返回直接实现的接口数组
  • isAssignableFrom:判断向上转型是否成立

annotation

  • isAnnotationPresent(class):判断annotation是否存在
  • getAnnotation(class):取得annotation,不存在返回null

泛型?

编写模板代码来适应任意类型

1
2
3
4
5
ArrayList<T>

new ArrayList<String>

new ArrayList<Integer>

编写泛型

先定义泛型类型<T>

1
2
3
public Pair<T> {

}

静态方法不能引用<T>,应新建一个泛型<K>

1
2
3
public static <K> Pair<K> create(K first, K second) {

}

EOF


>