9.反射和Lambda表达式

目录

一、反射

1.反射是什么

2.反射操作的四个核心类(都处在java.lang.reflect)

3.在java中获取一个类的class对象一共有三种途径:

4.想通过反射来操作类或者对象,第一步就是要获得该类的class对象。

 5.Constructor应用

 6.Method应用

 7.Field应用

二、Lambda表达式(有的语言称为闭包)

1.最常见的写法:

 2.使用匿名内部类来简化子类的实现。

 3.使用Lambda表达式

 4.不同情况的Lambda表达式


一、反射

1.反射是什么

动态(运行时)获取类信息以及动态调用该对象的属性和方法的功能,就叫反射

在所有第三方框架的基础上。在运行时,

对任意一个类,都能拿到该类的所有属性和方法的信息

对于任意一个属性,都能调用该对象的任意属性和方法。

2.反射操作的四个核心类(都处在java.lang.reflect)

class 关键字,声明一个类

Class:反射操作的核心类

Constructor:与构造方法相关的类

Methon:与类中方法相关的类

Field:与类中属性相关的类

3.在java中获取一个类的class对象一共有三种途径:

 (1)直接通过类名称 .class获取class对象

 (2)通过该类的任意实例化对象,调用getClass()方法

 (3)使用Class类提供的Class.forName("类的全名称")

4.想通过反射来操作类或者对象,第一步就是要获得该类的class对象。

编译期类型

运行时类型RTTI

Person per = new Student();

per这个引用编译期类型就是Person

最终在JVM运行的时候,到底是哪个类型,运行时类型

9.反射和Lambda表达式_第1张图片

 5.Constructor应用

1.通过反射来创建一个类的实例

9.反射和Lambda表达式_第2张图片

 通过class对象的newInstance()方法默认调用该类的无参构造,当无参构造不存在,或者无参构造不可见(private,不同包的包权限)这个方法无法使用。

9.反射和Lambda表达式_第3张图片

 2.当需要使用类的其他构造方法来创建对象时,需要用到和构造方法这个结构相关的反射类Constructor

(1) Class类的getConstructors():只能获取当前类的所有public权限的构造方法

无法获取父类的Constructor对象

9.反射和Lambda表达式_第4张图片

 (2)Class类的getDeclearConstructors()可以拿到当前类的所有构造方法,甚至包含私有方法

无法获取父类的Constructor对象

9.反射和Lambda表达式_第5张图片

(3)拿到指定的Constructor对象,可以通过该对象来创建实例化Student对象

9.反射和Lambda表达式_第6张图片

 (4)通过constructor类创建私有构造方法的对象9.反射和Lambda表达式_第7张图片

 6.Method应用

(1)cls.getMethods( )     可以拿到当前类已经父类的所有public方法

9.反射和Lambda表达式_第8张图片

 (2)cls.getDeclareMethods()    仅能拿到当前类定义的所有方法,包含private方法

拿到Methods对象后,通过反射来调用对象的

9.反射和Lambda表达式_第9张图片

 总结:通过反射来调用一个类的方法

1.先获取该类的class对象

2.通过getDec或getMethod获取这个方法的method反射对象

3.若该方法是一个成员方法,还需要产生该类的实例

4.method.invoke(该类的实例(如果是静态方法就是null),具体的方法参数);

 7.Field应用

9.反射和Lambda表达式_第10张图片

 Field的使用

1.先获取class对象

2.获取指定名称的Field对象

3.创建该类的实例(如果你调用的是成员属性)

4.   set(obj-具体操作的对象,要设置的属性值)

      get(obj-具体操作的对象)--获取相应的属性值。

二、Lambda表达式(有的语言称为闭包)

一种编程范式,函数式编程

面向对象的编程,啥都需要类,有个对象,通过对象去处理数据和方法

在大数据运算中,通常我们只需要关系特定的方法调用即可。

在Java中,Lambda表达式的前身就是匿名内部类的简化写法

Lambda表达式的语法:

(参数列表) -> {

      方法体代码

      [return 返回值];

}

1.最常见的写法:

9.反射和Lambda表达式_第11张图片

 2.使用匿名内部类来简化子类的实现。

假设此时具体的实现子类只会使用一次,就没必要每次都创建一个对象

9.反射和Lambda表达式_第12张图片

相当于

class  没名字  implements Imessage{

    覆写了printMessage方法

}

 3.使用Lambda表达式

使用规则:

如果只有一条语句,花括号可以省略。大于一条,不能省略

参数类型可以省略,若省略了,则每个参数的类型都要省略

1.直接省略了所有和类相关的代码,只保留了最核心的方法的代码,包括方法的参数,方法的方法体

9.反射和Lambda表达式_第13张图片

任何一个可以使用Lambda表达式的接口,前提是只有一个抽象方法(Lambda表达式把方法名都省了,因此默认就覆写那个抽象方法)

2.此注解用在接口声明上,检查当前的接口是否只包含一个抽象方法

9.反射和Lambda表达式_第14张图片

3. 在JDK1.8中,对接口做了扩展,允许接口存在普通方法。

普通方法使用default来声明,包含方法体。

9.反射和Lambda表达式_第15张图片

 4.不同情况的Lambda表达式

对于接口的抽象方法分为以下几种情况

   (1)无返回值无参数

   (2)无返回值有参数

   (3)有返回值无参数

   (4)有返回值有参数

public class LambdaUsage {
    public static void main(String[] args) {
//        NonReturnNonParameter i1 = () -> {
//           //如果有多行代码,大括号不可以省略
//            System.out.println("我是第一行");
//            System.out.println("我是第二行");
//            System.out.println("我是第三行");
//        };
//        i1.test1();  //调用的就是刚覆写的方法
//
//
//
//        NonReturnHasParameter i2 = (t1,t2) -> {
//         t1 =t1+1;
//         t2 = "门门";
//            System.out.println(t2 + ":" +t1);
//        };
//        i2.test2(18,"hello");

//        HasReturnNoneParameter i3 = () -> {
//          int num =0;
//          //num要经过一大堆的运算
//            num += 10;
//            return num;
//        };
//        int res = i3.test3();
//        System.out.println(res);
//        HasReturnNoneParameter i3 = () ->10;
//        int res  =i3.test3();
//        System.out.println(res);

        HasReturnHasParameter i4 = (t1,t2) -> {
          t1 += 101;
            System.out.println(t2);
            return t1;
        };
        int res = i4.test4(18,"我是门门");
        System.out.println(res);
    }
}
interface  NonReturnNonParameter{
    void test1();
}

interface NonReturnHasParameter{
    void test2(int age,String name);
}

interface HasReturnNoneParameter{
    int test3();
}

interface  HasReturnHasParameter{
    int test4(int age,String name);
}

你可能感兴趣的:(数据结构,java,jvm,开发语言)