博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型、反射、注解、Lambda表达式
阅读量:4067 次
发布时间:2019-05-25

本文共 2446 字,大约阅读时间需要 8 分钟。

泛型介绍

(使用频率高)

泛型类型是通过类型参数化的泛型类或接口。通过类型参数化,来解决程序的通用性设计和实现的若干问题。

泛型试图解决的问题:

  • 编译期类型检查:可以避免运行时错误的发生
  • 强制类型检查
  • 可读性和灵活性

泛型本身就是对于继承在使用上的一种增强。编译器在编译源码时,首先进行泛型类型参数的检查,然后进行类型 擦除并同时在类型参数出现的位置插入强制类型转换指令从而实现

限定通配符和非限定通配符

反射机制

  • 自描述:通过反射获取类、属性、方法的信息

例如:可以获取类的构造器信息和对应的参数个数、可以获取类的属性信息、可以获取类的方法信息。

public class Apple(){
public Apple(){ } public Apple(String name){ this.name = name; } public String getName(){ return name; } public void setName(String name){ this.name = name; }}Class clazz = Apple.class;final Constructor[] constructors = clazz.getConstructors();//获取Apple类的构造器信息和对应的参数个数for(Constructor constructor : constructors){ System.out.println("construtor name:" + construtor.getName() + ", params length:" + constructor.getParameters().length);}//获取Apple类的属性信息final Field[] fields = clazz.getDeclaredFields();for(Field field : fields){ System.out.println("field name:" + field.getName());}//获取Apple类的方法信息final Method[] declaredMethods = clazz.getDeclaredMethods();for(Method method : declaredMethods){ System.out.println("method name:" + method.getName());}
  • 自控制:构造对象控制对对象的属性和行为
class appleClazz = Class.forName("Apple");final Constructor constructor = appleClazz.getConstructor(String.class);final Object appleInstance = constructor.newInstance("China Apple");

反射机制的优势

非反射方式Java类的运行步骤:Apple.java -> 编译器 -> Apple.class -> JVM -> 运行

反射方式: 未知类型 -> 编译器 -> 运行

优势

- 在一些场景中,“未知类型”实际上大大增加了程序运行时的灵活性,但是性能稍有损耗
- 对于对象的类型可以在运行时判断,这样的特性实际上是对多态极大的增强,进一步将上层的抽象与下层的具体实现解耦

JBDC Driver:

final String DBUSER = "root";final String DBPASS = "";final String DBURL = "jbdc:mysql://localhost:3006/test";String DBDRIVER = "com.mysql.jdbc.Driver";Connection con = null;Class.forName(DBDRIVER);con = DriverManager.getConnection(DBURL, DBUSER, DBPASS);System.out.println(con);con.close();
  • JDBC的驱动加载方式通过反射机制实现,保证运行时可以动态选择要加载的驱动程序,程序的灵活性大大增强。
  • JDBC只是设计了驱动需要实现的接口,不关心驱动厂商的个数和实现方式,只要按照统一的规范即可,至于类型的判断,交给运行期动态判断即可,反射的使用体现了多态,降低了类与类之间的耦合度。

注解的使用

注解是一种元数据,本身其实没有任何作用,如果要有,必须要依附在具体的对象上。

例:@Override

  • 第一层理解:在方法上加一个标签,表示这是一个继承关系,子类已经重写的方法
  • 等二层理解:这个标签加上后,如果父类中没有该方法,那么编译时就会报错,而且可以解决一些不留心将方法名拼错的情况,同时增加了程序的可读性。

注解——问题抽象:应用范围、生命周期、可读性、注解继承

基本用法

定义一个苹果描述注解:

@Target({METHOD, TYPE})@Rentention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface AppleDescription{
//定义了一个String的注解属性 String value();}

lambda表达式

匿名函数、函数式编程思想。

  • 语法:(params) -> {statements;} / (params) -> expression / param -> experession
  • 用法:可以替代特定匿名内部类,必须继承函数式接口。

转载地址:http://enoji.baihongyu.com/

你可能感兴趣的文章
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
java自定义容器排序的两种方法
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
AngularJS2中最基本的文件说明
查看>>
从头开始学习jsp(2)——jsp的基本语法
查看>>
使用与或运算完成两个整数的相加
查看>>
备忘:java中的递归
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>