日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java学习笔记——反射

發布時間:2023/12/10 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java学习笔记——反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、反射概述

Java反射機制:是指在運行時去獲取一個類的變量和方法信息。然后通過獲取到的信息來創建對象,調用方法的一種機制。由于這種動態性,可以極大地增強程序的靈活性。

2、獲取Class類的對象

我們要想通過反射去使用一個類,首先我們要獲取到該類的字節碼文件對象,也就是類型為Class類型的對象,這里我們提供了三種方法獲取Class類型的對象: ①使用類的class屬性來獲取該類對應的Class對象。距離:Student.Class將會返回Student類對應的Class對象。 ②調用對象的getClass()方法,返回該對象所屬類對應的Class對象,該方法是Object類中的方法,所有的Java對象都可以調用。 ③使用Class類中的靜態方法forName(String className),該方法需要傳入字符串參數,該字符串參數的值是某個類的全路徑,也就是完整包名的路徑。

3、反射獲取構造方法并使用

Class類中用于獲取構造方法的方法: //Constructor<?>[] getConstructors?()返回一個包含Constructor對象的數組,Constructor對象反映了由該Class對象表示的類的所有公共構造函數。 //Constructor<?>[] getDeclaredConstructors?()返回反映由該Class對象表示的類聲明的所有構造函數的Constructor對象的數組。 //Constructor<T> getConstructor?(Class<?>...parameterTypes)返回一個Constructor對象,該對象反映由該Class對象表示的類的指定公共構造函數。 //Constructor<T> getDeclaredConstructor?(Class<?>...parameterTypes)返回一個Constructor對象,該對象反映由此Class對象表示的類或接口的指定構造函數。Constructor類中用于創建對象的方法 //TnewInstance?(Object...initargs)使用由此Constructor對象表示的構造函數,使用指定的初始化參數來創建和初始化構造函數的聲明類的新實例。 基本數據類型也可以通過.class得到對應的Class類型//public void setAccessible?(boolean flag)將此反射對象的accessible標志設置為指示的布爾值。值為true表示反射對象應該在使用Java語言訪問控制時抑制檢查。值為false表示反射對象應該在使用Java語言訪問控制時執行檢查,并在類描述中指出變體。 //學生類 public class Student {//三個成員變量,一個私有,一個默認,一個公共private String name;int age;public String address;//四個構造方法,一私有,一默認,兩公共public Student() {}private Student(String name) {this.name = name;}Student(int age) {this.age = age;}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}//成員方法:一個私有,四個公共private void function() {System.out.println("function");}public void method1() {System.out.println("method1");}public void method2(String s) {System.out.println("method2" + s);}public String method3(String s, int i) {return s + "," + i;}@Overridepublic String toString() {return "Student{name =" + name + ", age = " + age + ", adress = " + address + "}";} }public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,InstantiationException, IllegalAccessException, InvocationTargetException { // Student s = new Student();//獲取Class對象Class<?> c = Class.forName("myReflectDemo.Student");//基本數據類型也可以通過.class得到對應的Class類型Constructor<?> con = c.getConstructor(String.class, int.class, String.class);Object o = con.newInstance("張三豐", 30, "西安");System.out.println(o);System.out.println("----------");//暴力反射//public void setAccessible?(boolean flag)將此反射對象的accessible標志設置為指示的布爾值。// 值為true表示反射對象應該在使用Java語言訪問控制時抑制檢查。// 值為false表示反射對象應該在使用Java語言訪問控制時執行檢查,并在類描述中指出變體。Constructor<?> decon = c.getDeclaredConstructor(String.class);decon.setAccessible(true);Object o1 = decon.newInstance("張三豐");System.out.println(o1);} 運行結果: Student{name =張三豐, age = 30, adress = 西安} ---------- Student{name =張三豐, age = 0, adress = null}

4、反射獲取成員變量并使用

Class類中用于獲取成員變量的方法: //Field[] getFields?()返回一個包含Field對象的數組,Field對象反映由該Class對象表示的類或接口的所有可訪問的公共字段。 //Field getField?(String name)返回一個Field對象,該對象反映由該Class對象表示的類或接口的指定公共成員字段。 //Field[] getDeclaredFields?()返回一個Field對象的數組,反映了由該Class對象表示的類或接口聲明的所有字段。 //Field getDeclaredField?(String name)返回一個Field對象,該對象反映由該Class對象表示的類或接口的指定聲明字段。//voidset?(Object obj,Object value) 給obj對象的成員變量賦值為value 將指定的對象參數中由此Field對象表示的字段設置為指定的新值。 public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException,NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//獲取Class對象Class<?> c = Class.forName("myReflectDemo.Student");//Student s = new Student();Constructor<?> con = c.getConstructor();Object obj = con.newInstance();System.out.println(obj);System.out.println("----------");Field name = c.getDeclaredField("name");//public void setAccessible?(boolean flag)將此反射對象的accessible標志設置為指示的布爾值。 值為true表示反射對象應該在使用Java語言訪問控制時抑制檢查。// 值為false表示反射對象應該在使用Java語言訪問控制時執行檢查,并在類描述中指出變體。name.setAccessible(true);name.set(obj, "張三豐");System.out.println(obj);System.out.println("----------");Field age = c.getDeclaredField("age");age.setAccessible(true);age.set(obj, 36);System.out.println(obj);System.out.println("----------");Field field = c.getField("address");field.set(obj, "西安");System.out.println(obj);} 運行結果:Student{name =null, age = 0, adress = null}----------Student{name =張三豐, age = 0, adress = null}----------Student{name =張三豐, age = 36, adress = null}----------Student{name =張三豐, age = 36, adress = 西安}

5、反射獲取成員方法并使用

Class類中用于獲取成員方法的方法 //Method[] getMethods?()返回一個包含方法對象的數組,方法對象反映由該Class對象表示的類或接口的所有公共方法,包括由類或接口聲明的對象以及從超類和超級接口繼承的類。 //Method[] getDeclaredMethods?()返回一個包含方法對象的數組,方法對象反映由Class對象表示的類或接口的所有聲明方法,包括public,protected,default(package)訪問和私有方法,但不包括繼承方法。 //Method getMethod?(Stringname,Class<?>...parameterTypes)返回一個方法對象,該對象反映由該Class對象表示的類或接口的指定公共成員方法。 //Method getDeclaredMethod?(Stringname,Class<?>...parameterTypes)返回一個方法對象,它反映此表示的類或接口的指定聲明的方法Class對象。Method類中用于調用成員方法的方法 //Objectinvoke?(Objectobj,Object...args)在具有指定參數的指定對象上調用此方法對象表示的基礎方法。 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//獲取Class對象Class<?> c = Class.forName("myReflectDemo.Student");//Method[] getMethods?() 返回一個包含 方法對象的數組,方法對象反映由該 Class對象表示的類或接口的所有公共方法,// 包括由類或接口聲明的對象以及從超類和超級接口繼承的類。Method[] methods = c.getMethods();for (Method m : methods) {System.out.println(m);}System.out.println("-------------");//Method[] getDeclaredMethods?() 返回一個包含 方法對象的數組,方法對象反映由 Class對象表示的類或接口的所有聲明方法,// 包括public,protected,default(package)訪問和私有方法,但不包括繼承方法。Method[] dm = c.getDeclaredMethods();for (Method m : dm) {System.out.println(m);}System.out.println("-------------");//Method getMethod?(String name, Class<?>... parameterTypes) 返回一個方法對象,// 該對象反映由該 Class對象表示的類或接口的指定公共成員方法。Method method1 = c.getMethod("method1"); // System.out.println(method1);//獲取無參構造方法創建對象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();//Object invoke?(Object obj, Object... args) 在具有指定參數的指定對象上調用此方法對象表示的基礎方法。//Object:返回值類型//obj:調用方法的對象//args:方法需要的參數method1.invoke(obj);} 運行結果:public java.lang.String myReflectDemo.Student.toString()public void myReflectDemo.Student.method1()public java.lang.String myReflectDemo.Student.method3(java.lang.String,int)public void myReflectDemo.Student.method2(java.lang.String)public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()-------------public java.lang.String myReflectDemo.Student.toString()private void myReflectDemo.Student.function()public void myReflectDemo.Student.method1()public java.lang.String myReflectDemo.Student.method3(java.lang.String,int)public void myReflectDemo.Student.method2(java.lang.String)-------------method1

獲取成員方法案例

// 有一個ArrayList<Integer>集合,如何在這個集合中添加字符串元素? public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//創建集合對象ArrayList<Integer> array = new ArrayList<Integer>();//獲取Class對象Class<? extends ArrayList> c = array.getClass();//獲取add方法Method add = c.getMethod("add", Object.class);add.invoke(array, "hello");add.invoke(array, "world");add.invoke(array, "java");System.out.println(array);} 運行結果: [hello, world, java]

總結

以上是生活随笔為你收集整理的Java学习笔记——反射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。