每月博客-20180204

一.一月主要工作

1月份,逐渐地恢复到了互金项目的参与之中,各项工作拾在手上,跟进进度和各项情况,主要地,包括以下几件工作:

1.大数据平台跑批;网贷系统新增模块及已有功能完善;

2.关键需求推动:理财通合作贷款需求;借呗二期合作贷款需求;滴滴合作贷款需求;

3.相关架构问题讨论:对账机制及处理方案;订单模式失败重试方案;额度编号与借据编号的对应关系落地方案;外部编号与内部编号的映射关系及落地系统;互金标准输出模式;一账通方案;

4.其他工作:征信处理;资产证券化讨论等;

二.技术学习

在技术学习方面,自己学习了java注解篇章及几种设计模式,JAVA注解,个人学习的理解主要如下:

(参考文档:https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

https://www.cnblogs.com/guangshan/p/4886029.html

http://www.importnew.com/14227.html,

等,注意理解一下注解处理器,aop框架,代理模式之间的关系)

1.注解是一种标记,作用于java的各种元素之上,本身不会影响程序的业务逻辑,但可以起到辅助性作用,java提供了注解相关的api,运行时通过获取程序元素上的注解(注解处理器可以自定义实现类或动态代理生成),对程序执行产生相应的影响。

  注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。

       Annotation是一个特殊的class,类似于enum,由于与普通class的特异性,使用getAnnocation获取的返回值,其实Annotation的代理类:sun.reflect.annotation.AnnotationInvocationHandle,所有对注解内属性的访问都是通过代理类实现的。

1)java中程序员可以自定义注解,同时,java提供了4中元注解,即自定义注解的注解,它们是:

   @Documented –注解是否将包含在JavaDoc中
   @Retention –什么时候使用该注解
   @Target –注解用于什么地方
   @Inherited – 是否允许子类继承该注解

  (1.)@Retention– 定义该注解的生命周期
  ●   RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
  ●   RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
  ●   RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

 ( 2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
  ● ElementType.CONSTRUCTOR:用于描述构造器
  ● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
  ● ElementType.LOCAL_VARIABLE:用于描述局部变量
  ● ElementType.METHOD:用于描述方法
  ● ElementType.PACKAGE:用于描述包
  ● ElementType.PARAMETER:用于描述参数
  ● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

 (3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。

 (4.)@Inherited – 定义该注释和子类的关系
     @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

2)同时,java提供了3中内置注解,它们是:

1.)Override
      java.lang.Override是一个标记类型注解,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种注解在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
  2.)Deprecated
     Deprecated也是一种标记类型注解。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的“延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@Deprecated,但编译器仍然要报警。
 3.)SuppressWarnings
     SuppressWarning不是一个标记类型注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
  @SuppressWarnings("unchecked")

3)java注解API

通过反射获取Annotation类对象

  注解对象是在一个类的class对象中的,一个类只有一个class实例,所以Annotation也是唯一的,对应于一个class文件。注:一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。例如,int不是类,但int.class是一个Class类型的对象。虚拟机为每个类型管理一个Class对象。因此,可以用==运算符实现两个类对象比较的操作。

  如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。  

  反射中获取注解的类库,注解处理器类库(java.lang.reflect.AnnotatedElement):

  Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:

说明 对应的ElementType
Class 类定义 TYPE、ANNOTATION_TYPE
Constructor 构造器定义 CONSTRUCTOR
Field 类的成员变量定义 FIELD
Method 类的方法定义 METHOD
Package 类的包定义 PACKAGE

  注1:TYPE其实已经包含了ANNOTATION_TYPE,这个只是为了更细分

  注2:上面没有提到的ElementType.PARAMETER,可以使用Method类的Annotation[][] getParameterAnnotations() 方法获取,多个参数每个参数都可能有多个注解,所以才是二维数组。

  注3:LOCAL_VARIABLE暂时不知道怎么获取,好像也没啥必要获取。

   方法使用:AnnotatedElement接口中有四个方法,用于获取注解类型

  <T extends Annotation> T getAnnotation(Class<T> annotationClass)   如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

  Annotation[] getAnnotations()   返回此元素上存在的所有注释。

  Annotation[] getDeclaredAnnotations()   返回直接存在于此元素上的所有注释。

  boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)  如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。

  用法:注解类型 anno = Class.getAnnotation(注解类型.class)

    之后就可以调用注解类型中的属性来获取属性值了。示例:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Father {
String value();
}

@Father("bca")
public class Son {
public static void main(String[] args) {
Father father = Son.class.getAnnotation(Father.class);
System.out.println(father.value());
}
}

4)自定义实例及注解使用

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* 水果名称注解
*/
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}

import java.lang.reflect.Field;

/**
* 注解处理器
*/
public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz){

String strFruitName=" 水果名称:";

Field[] fields = clazz.getDeclaredFields();

for(Field field :fields){
if(field.isAnnotationPresent(FruitName.class)){
FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
strFruitName=strFruitName+fruitName.value();
System.out.println(strFruitName);
}
}
}
}

import test.FruitColor.Color;

/**
* 注解使用
*/
public class Apple {

@FruitName("Apple")
private String appleName;

public void setAppleName(String appleName) {
this.appleName = appleName;
}
public String getAppleName() {
return appleName;
}

public void displayName(){
System.out.println("水果的名字是:苹果");
}
}

/**
* 输出结果
*/
public class FruitRun {
public static void main(String[] args) {
FruitInfoUtil.getFruitInfo(Apple.class);
}
}

5) 注解的用途:

     1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
      2、跟踪代码依赖性,实现替代配置文件功能。比如Dagger 2依赖注入,未来java开发,将大量注解配置,具有很大用处;
      3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

除了java内置注解之外,很多知名框架也使用了注解,如:

Junit   Hibernate ORM Spring MVC  Findbugs等

6)设计模式

看了代理模式(静态代理与动态代理),装饰模式,适配器模式,工厂,单例模式等,不是很明白,代理模式和装饰模式的本质区别。

可参考:http://zz563143188.iteye.com/blog/1847029

三.相关感想

除了做好平常的生活和工作之外,人一定要去系统性的整理一门理论,当然,绝不是空谈的理论,是基于个人实践所形成的,一套系统性、实用性的方法论,

譬如说,项目管理方法,这样做有很多的好处,避免工作中交谈起来时毫无头绪地乱谈,平常工作中虽忙,但静下来去想的时候,又说不出来哪些是重点,怎么一个工作的思路,工作的主线是什么,计划是什么,怎样保证项目

按照正确的方向执行,怎样培养领导力,带领团队高效地推动工作开展等等;这些都依赖于日常工作中有意识地去思考,去学习,去总结。当你形成自己的一套方法论的时候,可以侃侃而谈,运用起来非常熟练且有效,自己也会非常地自信。

原文地址:https://www.cnblogs.com/songtianbao/p/8414062.html