Java泛型、反射、注解、Lambda表达式

泛型介绍

(使用频率高)

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

泛型试图解决的问题:

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

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

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

反射机制

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

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

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
@Documented
public @interface AppleDescription{
    //定义了一个String的注解属性
    String value();
}

lambda表达式

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

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

https://yq.aliyun.com/video/play/1433

https://yq.aliyun.com/video/play/1434

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值