国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java語言----反射、枚舉以及l(fā)ambda表達式

這篇具有很好參考價值的文章主要介紹了Java語言----反射、枚舉以及l(fā)ambda表達式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一.反射

1.1反射的基本情況

1.2反射中最重要的類

1.2.1 Class類

1.2.2Field類

1.2.3Constructor類

1.2.4Method類

1.3反射優(yōu)缺點?

二.枚舉

2.1概念

2.2枚舉(enum)類方法

2.3枚舉的構造

三.Lambda表達式

3.1Lambda介紹

3.2 函數(shù)式接口

3.3使用lambda表達式

3.2.1不使用Lambda表達式調(diào)用

3.2.2使用Lambda表達式

3.2.3二者區(qū)別

3.4變量捕獲

3.4.1匿名內(nèi)部類的變量捕獲

?3.4.2Lambda變量捕獲

總結


??個人主頁:tq02的博客_CSDN博客-C語言,Java,Java數(shù)據(jù)結構領域博主
???夢的目標:努力學習,向Java進發(fā),拼搏一切,讓自己的未來不會有遺憾。
???歡迎各位→點贊?? + 收藏? + 評論??+關注?
? 本章講解內(nèi)容:反射、枚舉以及Lambda表達式? ? ?
Java語言----反射、枚舉以及l(fā)ambda表達式

?使用編譯器:IDEA

一.反射

1.1反射的基本情況

定義:Java在 運行 狀態(tài)時,對于任意一個類,都能知道這個類的所有屬性和方法。

? ??這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射(reflection)機制

?用途:1.在日常的第三方應用開發(fā)過程中,經(jīng)常會遇到某個類的某個成員變量、方法或是屬性是私有的或是只對系統(tǒng)應用開放,這時候就可以利用?Java的反射機制?來獲取所需的私有成員或是方法 。
????????2. 反射最重要的用途就是開發(fā)各種通用框架,比如在spring中,我們將所有的類Bean交給spring容器管理,無論是XML配置Bean還是注解配置,當我們從容器中獲取Bean來依賴注入時,容器會讀取配置,而配置中給的就是類的信息,spring根據(jù)這些信息,需要創(chuàng)建那些Bean,spring就動態(tài)的創(chuàng)建這些類。

1.2反射中最重要的類

類名 ? ? ? ? 用途
class類 代表類的實體,在運行的Java應用程序中表示類和接口
Field類 代表類的成員變量、類的屬性
Method類 代表類的方法
Constructor類

代表類的構造方法

在講解這些類之前,我們需要先構建一個類,方便進行反射的操作:

class Student{
//私有屬性name
    private String name = "tq02";
//公有屬性age
    public int age = 22;
//不帶參數(shù)的構造方法
    public Student(){
    System.out.println("Student()");
    }
    private Student(String name,int age) {
    this.name = name;
    this.age = age;
    System.out.println("Student(String,name)");
    }
    
private void eat(){
    System.out.println("i am eat");
}
public void sleep(){
    System.out.println("i am pig");
}
private void function(String str) {
    System.out.println(str);
} 

@Override
public String toString() {
    return "Student{" +
    "name='" + name + '\'' +
    ", age=" + age +
    '}';
}
}

?注:1.反射私有的構造方法、屬性、方法時,Java具有安全性,因此我們需要使用.setAccessible("boolean");

? ? ? ? 2.使用Class類、Field、Constructor類時,需要處理異常。

1.2.1 Class類

? ? ? ? ?在反射之前,第一步就是先拿到當前需要反射的類的Class對象,然后通過Class對象的核心方法,達到反射的目的,即:在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象, 都能夠調(diào)用它的任意方法和屬性,既然能拿到,我們就可以修改部分類型信息。


使用Class獲取三種方法

第一種:使用Class.forName("類的全路徑名“”); //靜態(tài)方法

第二種:使用.class方法。

第三種:使用類對象的getClass()方法;

注:無論哪種方法獲取,其實獲取的都是同一個類。


代碼實例 :

public class TestDemo {
public static void main(String[] args) {
//1.通過getClass獲取Class對象
    Student s1 = new Student();
    Class c1 = s1.getClass();

//2.直接通過 類名.class 的方式得到,該方法最為安全可靠,程序性能更高
//這說明任何一個類都有一個隱含的靜態(tài)成員變量 class
    Class c2 = Student.class;

//3、通過 Class 對象的 forName() 靜態(tài)方法來獲取,用的最多,
//但可能拋出 ClassNotFoundException 異常
    Class c3 = null;
    try {
//注意這里是類的全路徑,如果有包需要加包的路徑
    c3 = Class.forName("Student");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } 

//一個類在 JVM 中只會有一個 Class 實例,即我們對上面獲取的
//c1,c2,c3進行 equals 比較,發(fā)現(xiàn)都是true
System.out.println(c1.equals(c2));
System.out.println(c1.equals(c3));
System.out.println(c2.equals(c3));
}

1.2.2Field類

作用:可對類中屬性進行操作

方法 用途
getFiled(String name) 獲取某個公有的屬性對象
getFileds() 獲取所有公用的屬性對象
getDeclaredField(String name) 獲取某個屬性對象
getDeclcareFileds() 獲取所有屬性對象
public static void reflectPrivateField() {
  try {
            Class<?> classStudent = Class.forName("Student");
                                                     //獲取name成員變量
            Field field = classStudent.getDeclaredField("name");
            field.setAccessible(true);
            Student student= (Student)classStudent.newInstance();
//修改成員變量,將student中的name值改成"小明";
            field.set(student, "小明");
            String name = (String) field.get(student);
            System.out.println("反射私有屬性修改了name:" + name);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
}

1.2.3Constructor類

作用:對構造方法進行操作

方法 用途
getConstructor(類型.class,類型.class) 獲取該類中與參數(shù)類型匹配的公有構造方法
getConstructors() 獲得該類的所有公有構造方法
getDeclaredConstructors(類型.class,類型.class) 獲取該類中與參數(shù)匹配的構造方法(包含私有構造方法)
getDeclaredConstructors() 獲取該類所有的構造方法

?代碼實例:

//反射構造方法
    public static void reflect() {
       try {
           Class<?> c1 = Class.forName("Student");
           Constructor<?> c2= c1.getDeclaredConstructor(String.class,int.class);
           c2.setAccessible(true);

           c2.newInstance("湯琦",22);
       }catch(Exception ex)
       {
           ex.printStackTrace();
       }
    }

1.2.4Method類

作用:對類中方法進行操作

方法 用途
getMethod("方法名",類型.class) 使用該類的某個公有的方法
getMethods() 使用該類所有公有的方法
getDeclaredMethod("方法名",類型.class) 使用該類的某個方法
getDeclaredMethod() 使用該類所有方法

實例代碼:

public static void reflectPrivateMethod() {
        try {
            Class<?> c1 = Class.forName("Student");
            Method m1=c1.getDeclaredMethod("function", String.class);
            m1.setAccessible(true);

            Student fw=(Student) c1.newInstance();
            m1.invoke(fw,"給私有的function函數(shù)傳的參數(shù)");

        }catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

1.3反射優(yōu)缺點?

優(yōu)點:?1. 對于任意一個類,都能夠知道這個類的所有屬性和方法;對?于任意一個對象,都能夠調(diào)用它的任意一個方法
? ? ? ? ? 2. 增加程序的靈活性和擴展性,降低耦合性,提高自適應能力
? ? ? ? ? 3. 反射已經(jīng)運用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺點:?1. 使用反射會有效率問題。會導致程序效率降低。具體參考里:鏈接
? ? ? ? ? ? 2. 反射技術繞過了源代碼的技術,因而會帶來維護問題。反射代碼比相應的直接代碼更復雜?


二.枚舉

2.1概念

??????在Java中,可以說是一個集合,從下標0開始的集合。注:枚舉是jdk1.5以后引用的。

使用格式:? ?public enum? 類名{

? ? ? ? ? ? ? ? ? ? ?常量1、常量2、常量3;? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? }

就是將class換成了enum

代碼實例:

public enum TestEnum {
    RED,BLACK,GREEN,WHITE;//相當于集合,第一個常量下標值為0,第二個常量下標值為1......
    public static void main(String[] args) {
         TestEnum testEnum2 = TestEnum.BLACK;
         switch (testEnum2) {
         case RED: System.out.println("red"); break;
         case BLACK:System.out.println("black");break;
         case WHITE:System.out.println("WHITE");break;
         case GREEN:System.out.println("black");break;
         default:break;
}
}

2.2枚舉(enum)類方法

方法名 用法
values() 以數(shù)組形式返回枚舉的所有類型

ordinal()

獲取該枚舉成員的下標值
valueOf() 將普通字符串轉換成枚舉實例
compareTo() 比較兩個枚舉成員定義時的順序

2.3枚舉的構造

? ? ? 枚舉的構造方法默認是私有的。

public enum TestEnum {
    RED("red",1),BLACK("black",2),WHITE("white",3),GREEN("green",4);
    private String name;
    private int key;
/**
* 1、當枚舉對象有參數(shù)后,需要提供相應的構造函數(shù)
* 2、枚舉的構造函數(shù)默認是私有的 這個一定要記住
* @param name
* @param key
*/
    private TestEnum (String name,int key) {
        this.name = name;
        this.key = key;
    }
    public static TestEnum getEnumKey (int key) {
        for (TestEnum t: TestEnum.values()) {
        if(t.key == key) {
        return t;
        }
    } 
    return null;
}
    public static void main(String[] args) {
        System.out.println(getEnumKey(2));
    }
}

注:自己寫的枚舉類,默認繼承與enum這個類的。


三.Lambda表達式

3.1Lambda介紹

Lambda本質(zhì)是匿名函數(shù),基于數(shù)學中的λ演算得名,也可稱為閉包(Closure)

語法格式:(parameters)->expression 或 (parameters)->{ statements;}

parameters:類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。這里的參數(shù)類型可以明確的聲明也可不聲明而由JVM隱含的推斷。另外當只有一個推斷類型時可以省略掉圓括號。

->:可理解為“被用于”的意思

方法體:可以是表達式也可以代碼塊,是函數(shù)式接口里方法的實現(xiàn)。代碼塊可返回一個值或者什么都不反回,這里的代碼塊塊等同于方法的方法體。如果是表達式,也可以返回一個值或者什么都不反回。

常見表達式:

// 1. 不需要參數(shù),返回值為 2
() -> 2
// 2. 接收一個參數(shù)(數(shù)字類型),返回其2倍的值
x -> 2 * x
// 3. 接受2個參數(shù)(數(shù)字),并返回他們的和
(x, y) -> x + y
// 4. 接收2個int型整數(shù),返回他們的乘積
(int x, int y) -> x * y
// 5. 接受一個 string 對象,并在控制臺打印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)

3.2 函數(shù)式接口

? ? ? ? 定義:該接口有且只有一個?抽象方法

注:如果某接口含有@FunctionalInterface?注解,那么編譯器就會按照函數(shù)式接口的定義來要求該接口,這樣如果有兩個抽象方法,程序編譯就會報錯的。

代碼實例:

@FunctionalInterface
interface NoParameterNoReturn {
	//注意:只能有一個方法
	void test();
}

3.3使用lambda表達式

先建立幾個接口:

//無返回值無參數(shù)
@FunctionalInterface
interface NoParameterNoReturn {
void test();
} 
//無返回值一個參數(shù)
@FunctionalInterface
interface OneParameterNoReturn {
void test(int a);
} 
//無返回值多個參數(shù)
@FunctionalInterface
interface MoreParameterNoReturn {
void test(int a,int b);
} 
//有返回值無參數(shù)
@FunctionalInterface
interface NoParameterReturn {
int test();
} 
//有返回值一個參數(shù)
@FunctionalInterface
interface OneParameterReturn {
int test(int a);
} 
//有返回值多參數(shù)
@FunctionalInterface
interface MoreParameterReturn {
int test(int a,int b);
}

Lambda就是匿名內(nèi)部類的簡化,實際上是創(chuàng)建了一個類,實現(xiàn)了接口,重寫了接口的方法 。

3.3.1不使用Lambda表達式調(diào)用

public class TestDemo {
public static void main(String[] args) {
//接口使用匿名內(nèi)部類
    NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn(){
    @Override
    public void test() {
    System.out.println("hello");
    }
    };
noParameterNoReturn.test();
}

3.3.2使用Lambda表達式

public class TestDemo {
  public static void main(String[] args) {
    NoParameterNoReturn noParameterNoReturn = ()->{
    System.out.println("無參數(shù)無返回值");
};
noParameterNoReturn.test();
    OneParameterNoReturn oneParameterNoReturn = (int a)->{
    System.out.println("一個參數(shù)無返回值:"+ a);
};
oneParameterNoReturn.test(10);

    MoreParameterNoReturn moreParameterNoReturn = (int a,int b)->{
    System.out.println("多個參數(shù)無返回值:"+a+" "+b);
};
moreParameterNoReturn.test(20,30);

    NoParameterReturn noParameterReturn = ()->{
    System.out.println("有返回值無參數(shù)!");
    return 40;
};
//接收函數(shù)的返回值
int ret = noParameterReturn.test();
System.out.println(ret);
    OneParameterReturn oneParameterReturn = (int a)->{
    System.out.println("有返回值有一個參數(shù)!");
    return a;
};
ret = oneParameterReturn.test(50);
System.out.println(ret);

    MoreParameterReturn moreParameterReturn = (int a,int b)->{
    System.out.println("有返回值多個參數(shù)!");
    return a+b;
};
ret = moreParameterReturn.test(60,70);
System.out.println(ret);
}
}

3.3.3二者區(qū)別

代碼實例:

Java語言----反射、枚舉以及l(fā)ambda表達式

?1. 參數(shù)類型可以省略,如果需要省略,每個參數(shù)的類型都要省略。
?2. 參數(shù)的小括號里面只有一個參數(shù),那么小括號可以省略
?3. 如果方法體當中只有一句代碼,那么大括號可以省略
?4. 如果方法體中只有一條語句,且是return語句,那么大括號可以省略,且去掉return關鍵字。

3.4變量捕獲

變量捕獲,在匿名內(nèi)部類中也存在,而類似匿名內(nèi)部類的Lambda表達式,自然而然也存在。

3.4.1匿名內(nèi)部類的變量捕獲

Java語言----反射、枚舉以及l(fā)ambda表達式?如上圖,在匿名內(nèi)部類外,已經(jīng)定義了a的值,因此匿名內(nèi)部類直接捕獲了外部的a變量。

?3.4.2Lambda變量捕獲

Java語言----反射、枚舉以及l(fā)ambda表達式

??如上圖,使用直接捕獲了外部的a變量。

注:無論是匿名內(nèi)部類的變量捕獲還是Lambda變量捕獲,方法體里,不可修改外部變量的值。


總結

反射、枚舉以及Lambda表達式很少使用,算是偏僻的知識點,因此不要求掌握,只要求熟悉。文章來源地址http://www.zghlxwxcb.cn/news/detail-476281.html

到了這里,關于Java語言----反射、枚舉以及l(fā)ambda表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java- Lambda表達式

    目錄 一、Lambda簡介 二、Lambda使用前提 三、Lambda語法 1.操作符 a.\\\"-\\\" ?b.\\\"::\\\" 2.格式? a.無參數(shù) b.有參數(shù) 四、Lambda演化過程 五、Lambda實現(xiàn)排序 Lambda 表達式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)

    2024年02月03日
    瀏覽(28)
  • Java Lambda表達式

    1.1 函數(shù)式編程思想概括 在數(shù)學中,函數(shù)就是有輸入量、輸出量的一套計算方案,也就是“拿數(shù)據(jù)做操作” 面向對象思想強調(diào)“必須通過對象的形式來做事情” 函數(shù)式思想則盡量忽略面

    2024年02月07日
    瀏覽(42)
  • Java Lambda 表達式

    Java Lambda 表達式

    ??wei_shuo的個人主頁 ??wei_shuo的學習社區(qū) ??Hello World ! Java Lambda 表達式是 Java 8 引入的一種函數(shù)式編程特性,它是一種輕量級的匿名函數(shù),允許我們將函數(shù)作為方法的參數(shù)進行傳遞。Lambda 表達式可以理解為是一種簡潔的方式來表示可傳遞的代碼塊,它可以替代傳統(tǒng)的匿名內(nèi)

    2024年02月08日
    瀏覽(34)
  • Lambda表達式(JAVA)

    Lambda表達式(JAVA)

    注:如果沒有學過 匿名內(nèi)部類 和 接口 不推薦往下看。 (parameters) - expression 或 (parameters) -{ statements; } parameters:表示參數(shù)列表; -:可理解為“被用于”的意思; expression:表示一條語句; statements:表示多條語句。 Lambda可以理解為:Lambda就是匿名內(nèi)部類的簡化。 lambda表達式

    2024年02月08日
    瀏覽(28)
  • 【JAVA】包裝類、正則表達式、Arrays類、Lambda表達式

    包裝類是8種基本數(shù)據(jù)類型對應的引用類型 作用:后期的集合和泛型不支持基本類型,只能使用包裝類 基本數(shù)據(jù)類型和其對應的引用數(shù)據(jù)類型的變量可以互相賦值 基本數(shù)據(jù)類型 引用數(shù)據(jù)類型 byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean 包裝類

    2024年02月13日
    瀏覽(33)
  • java lambda表達式詳解

    java lambda表達式詳解

    我們知道,在Java中,接口是不能實例化的,但是接口對象可以指向它的實現(xiàn)類對象。如果接口連實現(xiàn)對象都沒有呢?那還可以使用匿名類的方式,如下: 復制 但是,使用匿名內(nèi)部的方式,代碼量其實并不是非常簡潔,而為了使代碼更加的簡潔,Java引進了 Lambda 表達式的寫法,

    2024年02月03日
    瀏覽(34)
  • Java學習——lambda表達式

    Java學習——lambda表達式

    什么是Lambda表達式? 可以將Lambda表達式理解為一個匿名函數(shù); Lambda表達式允許將一個函數(shù)作為另外一個函數(shù)的參數(shù); 我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼(將代碼作為實參),也可以理解為函數(shù)式編程, 將一個函數(shù)作為參數(shù)進行傳遞 。 為什么要引入Lambda表

    2024年02月04日
    瀏覽(38)
  • Java中的lambda表達式

    Java中的lambda表達式

    目錄 一、背景 二、lambada表達式的基本使用 三、變量捕獲 四、lambda在集合中的使用(map和set) 五、優(yōu)缺點 一、背景 (1)、lambda表達式的定義: (2)、lambda表達式的語法: (3)、函數(shù)式接口 二、lambada表達式的基本使用 (1)沒有使用lambda表達式,簡單調(diào)用函數(shù)式接口展

    2024年02月08日
    瀏覽(23)
  • Java新特性:Lambda表達式

    Java新特性:Lambda表達式

    Java新特性:Lambda表達式 Lambda 表達式(Lambda expression),也可稱為閉包(Closure),是 Java(SE)8 中一個重要的新特性。Lambda 表達式允許我們通過表達式來代替功能接口。Lambda 表達式就和方法一樣,它提供了一個正常的參數(shù)列表和一個使用這些參數(shù)的主體(body,可以是一個表

    2024年02月13日
    瀏覽(33)
  • Java 8 Lambda表達式詳解

    在Java 8中,引入了一種全新的函數(shù)編程概念,即Lambda表達式。這是一個重要的進步,它讓Java的功能得以大幅擴展,同時還讓代碼變得更加簡潔明了。接下來,我將詳細介紹Lambda表達式的相關知識,包括其基本語法、使用場景和特性。 Lambda表達式基本的語法可以分為三個部分

    2024年02月08日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包