java补充知识点(1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45044097/article/details/99285995

1 设计模式六大原则

可以参考一下,设计模式六大原则:
http://wiki.jikexueyuan.com/project/java-design-pattern-principle/principle-2.html

1.1 里氏替换原则

**里氏替换原则:**指的是任何基类可以出现的地方,子类一定可以出现。

定义1:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序p的行为没有发生变化,那么类型T2是类型T1的子类型。

定义2:所有引用基类的地方必须能透明地使用其子类对象。

通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能

它包含以下4层含义:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

2 注解

Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java注解是从 Java5 开始添加到 Java 的。

2.1 语法

因为平常开发少见,相信有不少的人员会认为注解的地位不高。其实同 classs 和 interface 一样,注解也属于一种类型。它是在 Java SE 5.0 版本中开始引入的概念。

注解通过@interface关键字进行定义。

扫描二维码关注公众号,回复: 7582458 查看本文章
public @interface TestAnnotation {
}

它的形式跟接口很类似,不过前面多了一个 @ 符号。上面的代码就创建了一个名字为 TestAnnotaion 的注解。

2.2 使用

注解可理解为标签。

@TestAnnotation
public class Test {
}

2.3 元注解

元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。

如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。

元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。

@Retention: 保留期,解释说明了这个注解的的存活时间。

取值如下:

  • RetentionPolicy.SOURCE 注解 :它将被限定在Java源文件中,在编译器进行编译时它将被丢弃忽视也不会在运行期间起任何作用,就和一个注释是一样的效果,只能被阅读Java文件的人看到;
  • RetentionPolicy.CLASS 注解只被保留到编译(到Class文件中)进行的时候,它并不会被加载到 JVM (Java虚拟机)中,我们在运行期也不能读取到;
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。(这个注解可以在运行期的加载阶段被加载到Class对象中。那么在程序运行阶段,我们可以通过反射得到这个注解,并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段。)

我们实际开发中的自定义注解几乎都是使用的RetentionPolicy.RUNTIME;
在默认的情况下,自定义注解是使用的RetentionPolicy.CLASS。

@Documented:将注解中的元素包含到 Javadoc 中
@Target: 指定注解运用地方(限定了运用场景)

类比到标签,原本标签是你想张贴到哪个地方就到哪个地方,但是因为 @Target 的存在,它张贴的地方就非常具体了,比如只能张贴到方法上、类上、方法参数上等等。
@Target 有下面的取值:
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Retention(RetentionPolicy.RUNTIME) //设置自定义注解的生命周期
/** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,
            FIELD,    /** 属性的声明 */
            METHOD,  /** 方法的声明 */
            PARAMETER,  /** 方法形式参数声明 */
            CONSTRUCTOR,  /** 构造方法的声明 */
            LOCAL_VARIABLE, /** 局部变量声明 */
            ANNOTATION_TYPE,  /** 注解类型声明 */
            PACKAGE  /** 包的声明 */
@Target(value ={ElementType.METHOD})
//@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
@Documented
public @interface CustomLabel {
    String name();
    int age();
}

@Inherited:

如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解;

@Repeatable: 可重复的意思

@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性(注解的值可以同时取多个)

反射的应用:

public class SimpleContainer {
    public static <T> T getInstance(Class<T> c) throws IllegalAccessException, InstantiationException {
        T obj = c.newInstance();
        Field[] fields = c.getDeclaredFields();
        for (Field f : fields){
            if (f.isAnnotationPresent(SimpleInject.class)){
                if (!f.isAccessible())
                    f.setAccessible(true);
                Class<?> fieldFls = f.getType();
                f.set(obj, getInstance(fieldFls));
            }
        }
        return obj;
    }
}

2.4 java预置注解

@Deprecated
这个元素是用来标记过时的元素。编译器在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。

@Override
子类要复写父类中被 @Override 修饰的方法

@SuppressWarnings
阻止警告。调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过@SuppressWarnings 达到目的

@SafeVarargs
参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。

@FunctionalInterface
函数式接口注解,这个是 Java 1.8 版本引入的新特性。函数式编程很火,所以 Java 8 也及时添加了这个特性。函数式接口 (Functional Interface) 就是一个具有一个方法的普通接口。

参考文章:
https://blog.csdn.net/briblue/article/details/73824058

3 DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

使用原因:
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
还可以使用 DTD 来验证您自身的数据。

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”

!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型

!ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型

!ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型

!ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型

4 JDK7,JDK8,JDK9比较

Java 8 新特性
https://www.runoob.com/java/java8-new-features.html

Java 9 新特性
https://www.runoob.com/java/java9-new-features.html

5 ThreadLocal

ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。

ThreadLocal的核心机制
1.每个Thread线程内部都有一个Map。
2.Map里面存储线程本地对象(key)和线程的变量副本(value)
3.但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。

Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal的应用场合,最适合的是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。

参考博客:
https://www.jianshu.com/p/98b68c97df9b
https://www.cnblogs.com/dolphin0520/p/3920407.html

6 Chart.js

首先,我们需要在页面上包含Chart.js库。该库占据了全局变量Chart。
<script src="Chart.js"></script>
可从CDN获得:
https://cdnjs.com/libraries/chart.js

6.1 创建图表

要创建图表,我们需要实例化Chart该类。为此,我们需要传递我们想要绘制图表的2d上下文。这是一个例子。

<canvas id="myChart" width="400" height="400"></canvas>

// Get the context of the canvas element we want to select
        var ctx = document.getElementById("myChart").getContext("2d");
        var myNewChart = new Chart(ctx).PolarArea(data);

还可以使用jQuery获取canvas的上下文。为此,我们需要从jQuery集合中获取DOM节点,并在其getContext(“2d”)上调用该方法。

// Get context with jQuery - using jQuery's .get() method.
	var ctx = $("#myChart").get(0).getContext("2d");
// This will get the first returned node in the jQuery collection.
	var myNewChart = new Chart(ctx);

在我们想要绘制的画布上实例化Chart类之后,Chart.js将处理视网膜显示的缩放。
设置Chart类后,我们可以继续创建Chart.js可用的图表之一。在下面的例子中,我们将绘制一个Polar面积图。

new Chart(ctx).PolarArea(data, options);

我们称之为我们想要创建的图表名称的方法。我们传递该图表类型的数据,并将该图表的选项作为参数传递。Chart.js将全局默认值与图表类型特定的默认值合并,然后将传入的任何选项合并为数据后的第二个参数。

6.2 全局图表配置

Chart.js 1.0中引入了此概念以保持配置DRY,并允许跨图表类型全局更改选项,从而无需为每个实例指定选项,也无需为特定图表类型指定默认选项。

6.3 折线图、条形图、雷达图、极地图、饼图、

参考文档:
http://chartjs.cn/docs/

折线图的代码

<template>
    <div class="small">    
        <canvas id="myChart2" width="400px" height="400px"></canvas>
    </div>
</template>
<script>
import Chart from 'chart.js';
export default {
    components: {
    },
    data() {
        return {
        }
    },
    mounted() {
        var ctx2 = document.getElementById("myChart2");
        var myChart2 = new Chart(ctx2, {
            type: "line",
            data: {
                labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                datasets: [
                    {
                        label: "test1",
                        backgroundColor: "rgba(225,10,10,0.3)",
                        borderColor: "rgba(225,103,110,1)",
                        borderWidth: 1,
                        pointStrokeColor: "#fff",
                        pointStyle: "crossRot",
                        data: [65, 59, 0, 81, 56, 10, 40, 22, 32, 54, 10, 30],
                        cubicInterpolationMode: "monotone",
                        spanGaps: "false",
                        fill: "false"
                    }
                ]
            },
            options: {                
            }
        });
    },
    methods: {
    }
}
</script>
<style>
.small {
    width: 500px;
    height: 500px;
}
</style>

代码参考:https://www.cnblogs.com/stealth7/p/7112216.html

在这里插入图片描述
new Chart(ctx2, configObject) 中的configObject对象中有三个重要的属性:

{
	type: "",
	data: {
	},
	options: {
	}
}

type属性表示图形形状:
line:折线图
bar:柱状图
Radar:雷达图/蛛网图
doughnut:圆环图
pie:饼图
polarArea:极地区域图
bubble:气泡分布图
scatter:散点图

data属性配置图形上的数据,data里的数据可以参考各个type的图每个参数的说明

options配置图形其他的可选项

另外我们选用一个库的一个很重要的因素是这个库浏览器的支持程度,经过实际的测试IE9+和chrome,firefox支持canvas的都可以使用。

7 java实现短信验证码

https://blog.csdn.net/qq_32196629/article/details/80062926

8 在Java Web中使用支付宝沙箱支付

https://blog.csdn.net/weixin_45044097/article/details/101266267

9 自定义标签库

< 开始标签 属性=“属性值” > 标签体 < /结束标签 >
分类:

  • ui标签 c:out:特点是显示数据,并且数据不是来源于标签体,而是来源于jsp标签本身。
  • 控制标签 if / foreach / c :特点是控制对象是标签体。
  • 数据标签 set:特点是存储数据,没有任何的页面效果。

自定义标签开发步骤:

  1. 创建一个标签助手类(继承BodyTagSupport)标签属性必须助手类的属性对应、且要提供对应get/set方法rtexprvalue;
  2. 创建标签库描述文件(tld),添加自定义标签的配置;
    注:tld文件必须保存到WEB-INF目录或其子目录
  3. 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签。

在这里插入图片描述
SKIP_BODY:跳过主体
EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面的后续部分
EVAL_BODY_AGAIN:再计算主体一次

参考博客
https://blog.csdn.net/wx1762813417/article/details/96468391

10 MD5加密

MD5的全称:Message-Digest Algorithm 5
数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 这就是tanajiya.tar.gz文件的数字签名。
MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的 “抵赖”,这就是所谓的数字签名应用。
参考数据加密的几种方法 MD5,sha1,sha256:
加密方式:https://blog.csdn.net/chain_fei/article/details/77822830
MD5加密:https://blog.csdn.net/qq_34161388/article/details/75581658

猜你喜欢

转载自blog.csdn.net/weixin_45044097/article/details/99285995