最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的反射應(yīng)用實現(xiàn)

 更新時間:2019年09月29日 10:00:51   作者:NULL_YM  
這篇文章主要介紹了java中的反射應(yīng)用實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

反射

我們先創(chuàng)建一個Student類出來。注意類中的成員變量、構(gòu)造方法、成員方法公共還是私有

package com.reflect;

public class Student {
 //成員變量
 public String name;//公共
 private int age;//私有
 
 //構(gòu)造方法
 public Student() {
 super();
 // TODO Auto-generated constructor stub
 }

 //私有構(gòu)造方法
 private Student(String name) {
 this.name = name;
 }
 
 public Student(String name, int age) {
 super();
 this.name = name;
 this.age = age;
 }

 //成員方法(getXxx/setXxx)
 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getAge() {
 return age;
 }

 public void setAge(int age) {
 this.age = age;
 }

 //成員方法
 public void study() {
 System.out.println("我愛學(xué)習(xí)java!");
 }
 // 私有
 private void study(String string) {
 System.out.println("我還愛學(xué)習(xí)"+string);
 }
 @Override
 public String toString() {
 return "Student [name=" + name + ", age=" + age + "]";
 }
}

反射概述

1、反射:反射是通過class文件對象,去使用文件對象的成員方法、構(gòu)造方法、成員變量

回想之前我們使用對象方法時必須通過new對象去使用。new Student().study(),此時我們就發(fā)現(xiàn)了一個問題,小例中我們肯定是知道Student類中是有study()方法的,如果我們想使用用這個類但卻不清楚類中的信息,此時反射就起到了一定作用。

其實反射的作用,不止這一點點。如下

2、反射可以提高程序的靈活性和擴展性,降低耦合性,提高自適應(yīng)能力。它允許程序創(chuàng)建和控制任何類的對象,無需提高硬編碼目標類

Java反射技術(shù)應(yīng)用領(lǐng)域很廣,后期如軟件測試、JavaBean等都有很重要的作用

許多流行的開源框架例如Struts、Hibernate、Spring在實現(xiàn)過程中都采用了該技術(shù)

3、性能問題:使用反射基本上是一種解釋操作,用于字段和方法接入時要遠慢于直接代碼。因此Java反射機制只要應(yīng)用在對;靈活性和擴展性要求很高的系統(tǒng)框架上,普通程序不建議使用使用反射會模糊程序內(nèi)部邏輯:程序員希望在代碼中看到程序的邏輯,反射等繞過了源代碼的技術(shù),因而會帶來維護問題。

反射獲取Class類對象

  1. 要想使用反射,我們必須得到class文件對象,也就是我們要使用的類Class對象
  2. 三種獲得class文件對象的方法:
    1. Object類的getClass()方法
    2. 數(shù)據(jù)類型的靜態(tài)屬性class
    3. Class類中的靜態(tài)方法public static Class forName(String classname)

一般我們使用第三種

package com.reflect;

public class Demo {
 public static void main(String[] args) throws ClassNotFoundException {
 // 方式1
 Student p = new Student();
 Class c = p.getClass();

 Student p2 = new Student();
 Class c2 = p2.getClass();

 System.out.println(p == p2);// false不是同一Student對象
 System.out.println(c == c2);// true是同一class對象

 // 方式2
 Class c3 = Student.class;
 System.out.println(c == c3);//true是同一class對象

 // 方式3
 // ClassNotFoundException(類找不到時)
 Class c4 = Class.forName("com.reflect.Student");
 System.out.println(c == c4);//true是同一class對象
 }

}

Class類中相關(guān)的幾個類

  • 和成員變量有關(guān) Field
  • 和構(gòu)造方法有關(guān) Constructor
  • 和成員方法有關(guān) Method
  • 有關(guān)的幾個方法
  • public T newInstance(Object… initargs) 使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實例,并用指定的初始化參數(shù)初始化該實例。

反射獲取構(gòu)造方法

先來認識幾個方法

public Constructor getConstructor()// 公共構(gòu)造方法對象
public Constructor[] getConstructors()//所有公共構(gòu)造方法對象
public Constructor[] getDeclaredConstructors()//所有構(gòu)造方法對象
public Constructor getDeclaredConstructor()//獲取私有構(gòu)造方法對象
public Constructor<T> getConstructor(Class<?>... parameterTypes)// 參數(shù)表示的是:你要獲取的構(gòu)造方法的構(gòu)造參數(shù)個數(shù)及數(shù)據(jù)類型的class字節(jié)碼文件對象
public void setAccessible(boolean flag)// 值為true則指示反射的對象在使用時應(yīng)該取消Java語言訪問檢查。 暴力訪問
package com.reflect;

import java.lang.reflect.Constructor;

public class ConstructorDemo {
 public static void main(String[] args) throws Exception {
 // 獲取字節(jié)碼文件對象
 Class c = Class.forName("com.reflect.Student");
 
 // 獲取所有構(gòu)造方法
 Constructor[] cons = c.getDeclaredConstructors();
 for (Constructor con : cons) {
  System.out.println(con);
 }

 // 獲取單個構(gòu)造方法
 Constructor con = c.getConstructor();// 返回的是構(gòu)造方法對象
 Constructor con1 = c.getConstructor(String.class, int.class);// 返回的是有參構(gòu)造方法對象
 Constructor con2 = c.getDeclaredConstructor(String.class);
 //創(chuàng)建對象 
 Object obj = con.newInstance();
 Object obj1=con1.newInstance("小米",12);
 // 暴力訪問
 con2.setAccessible(true);// 值為true則指示反射的對象在使用時應(yīng)該取消Java語言訪問檢查。
 Object obj2 = con2.newInstance("小白");
 
 System.out.println(obj.toString());
 System.out.println(obj1.toString());
 System.out.println(obj2.toString());
 
 }
}

 運行結(jié)果:

反射獲取成員變量

**類比上面Constructor類中的方法,這個類也有同樣的方法,獲取所有成員變量(返回數(shù)組),獲取私有成員變量等 這里不再贅述 **

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/*
 * 通過發(fā)生獲取成員變量并使用
 */
public class FieldDemo {
 public static void main(String[] args) throws Exception {
 // 獲取字節(jié)碼文件對象
 Class c = Class.forName("com.reflect.Student");

 // 獲取所有的成員變量
  Field[] fields = c.getFields();
  Field[] fields1 = c.getDeclaredFields();
  for (Field field : fields1) {
  System.out.println(field);
  }

 /*
  * Person p = new Person(); p.address = "北京"; System.out.println(p);
  */

 // 通過無參構(gòu)造方法創(chuàng)建對象
 Constructor con = c.getConstructor();
 Object obj = con.newInstance();
 System.out.println(obj);

 // 獲取單個的成員變量
 //通過成員變量名
 Field nameField = c.getField("name");
 // public void set(Object obj,Object value)
 // 將指定對象變量上此 Field 對象表示的字段設(shè)置為指定的新值。
 nameField.set(obj, "小紅"); // 給obj對象的addressField字段設(shè)置值為"北京"
 System.out.println(obj);

 // 獲取age并對其賦值
 // NoSuchFieldException 私有變量
 Field ageField = c.getDeclaredField("age");
 // IllegalAccessException 暴力訪問
 ageField.setAccessible(true);
 ageField.set(obj, 18);
 System.out.println(obj);

 }
}

運行結(jié)果:

反射獲取成員方法

**類比上面Constructor類中的方法,這個類也有同樣的方法,獲取所有成員方法(返回數(shù)組),獲取私有成員方法等 這里不再贅述 **

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class MethodDemo {
 public static void main(String[] args) throws Exception {
 // 獲取字節(jié)碼文件對象
 Class c = Class.forName("com.reflect.Student");

 // 獲取所有的方法
  Method[] methods = c.getMethods(); // 獲取自己的包括繼承父親的公共方法
  Method[] methods1 = c.getDeclaredMethods(); // 獲取自己的所有的方法
  for (Method method : methods1) {
  System.out.println(method);
  }

 Constructor con = c.getConstructor();
 Object obj = con.newInstance();
 
 // 獲取單個方法并使用
 // public void show()
 // public Method getMethod(String name,Class<?>... parameterTypes)
 // 第一個參數(shù)表示的方法名,第二個參數(shù)表示的是方法的參數(shù)的class類型
 Method m1 = c.getMethod("study");
 // public Object invoke(Object obj,Object... args)
 // 返回值是Object接收,第一個參數(shù)表示對象是誰,第二參數(shù)表示調(diào)用該方法的實際參數(shù)
 m1.invoke(obj); // 調(diào)用obj對象的m1方法

 System.out.println("----------");
 Method m2 = c.getDeclaredMethod("study", String.class);
 // NoSuchMethodException 訪問私有方法 暴力訪問
 m2.setAccessible(true);
 m2.invoke(obj, "數(shù)學(xué)");
 }
}

運行結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • minio安裝部署及使用的詳細過程

    minio安裝部署及使用的詳細過程

    MinIO是一個基于Apache?License?v2.0開源協(xié)議的對象存儲服務(wù),下面這篇文章主要給大家介紹了關(guān)于minio安裝部署及使用的詳細過程,文中通過實例代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • ShardingJdbc讀寫分離的BUG踩坑解決

    ShardingJdbc讀寫分離的BUG踩坑解決

    這篇文章主要為大家介紹了ShardingJdbc讀寫分離的BUG踩坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • SpringBoot?AOP?@Pointcut切入點表達式排除某些類方式

    SpringBoot?AOP?@Pointcut切入點表達式排除某些類方式

    這篇文章主要介紹了SpringBoot?AOP?@Pointcut切入點表達式排除某些類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 一篇文章帶你入門java集合

    一篇文章帶你入門java集合

    Java的集合類型都是對java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結(jié)
    2021-08-08
  • SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式

    SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式

    這篇文章主要介紹了SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java異步編程的5種異步實現(xiàn)方式詳解

    Java異步編程的5種異步實現(xiàn)方式詳解

    這篇文章主要介紹了Java異步編程的5種異步實現(xiàn)方式詳解,異步編程是程序并發(fā)運行的一種手段,它允許多個事件同時發(fā)生,當(dāng)程序調(diào)用需要長時間運行的方法時,它不會阻塞當(dāng)前的執(zhí)行流程,程序可以繼續(xù)運行,需要的朋友可以參考下
    2024-01-01
  • java在文件尾部追加內(nèi)容的簡單實例

    java在文件尾部追加內(nèi)容的簡單實例

    下面小編就為大家?guī)硪黄猨ava在文件尾部追加內(nèi)容的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • SpringBoot 如何添加容器啟動的初始化邏輯的操作方法

    SpringBoot 如何添加容器啟動的初始化邏輯的操作方法

    這篇文章主要介紹了SpringBoot 如何添加容器啟動的初始化邏輯,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java 分轉(zhuǎn)元與元轉(zhuǎn)分實現(xiàn)操作

    java 分轉(zhuǎn)元與元轉(zhuǎn)分實現(xiàn)操作

    這篇文章主要介紹了java 分轉(zhuǎn)元與元轉(zhuǎn)分實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java代碼實現(xiàn)哈希表(google 公司的上機題)

    Java代碼實現(xiàn)哈希表(google 公司的上機題)

    這篇文章主要介紹了Java 哈希表詳解(google 公司的上機題),本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

扎兰屯市| 鄢陵县| 封开县| 三穗县| 东辽县| 连州市| 宜兰县| 洪湖市| 庄浪县| 闻喜县| 河津市| 扎兰屯市| 民县| 田东县| 新安县| 沈丘县| 当涂县| 奉贤区| 保德县| 阿克陶县| 威宁| 从江县| 井研县| 南昌市| 墨江| 道孚县| 宁乡县| 云和县| 新竹市| 长寿区| 依安县| 玛纳斯县| 台江县| 延寿县| 哈密市| 郧西县| 四子王旗| 凤冈县| 海伦市| 共和县| 剑川县|