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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA反射机制初步理解

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA反射机制初步理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java中我們這樣聲明一個類,如人類

package cn.com.lcx.test;public class Person {public String sex = "男";private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}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 say(){System.out.println("姓名:"+name+",年齡:"+age+","+sex);} }

這是一個Person類型,java 類庫中有 String類型,

不管是我們自定義的 類型還是 java類庫中的類型 它們都有 構造函數、成員函數、成員屬性,java中對象是對客觀事物的抽象,類是對對象的抽象,所以java將所有的類型抽象成這樣一個類型:Class類型。

我們用Person 類聲明一個對象,Person p = new Person(); 這代表了一個具體的人類對象。

而我們的Class 類的對象就是具體的類如Person類,或者可以說是 Person類的那份二進制代碼。我們可以通過以下3種方式聲明Class 類的對象

Person person = new Person(); Class personClass1 = Person.class;//類名.class Class personClass2 = person.getClass();//Person類對象的getClass方法 Class personClass3 = Class.forName("cn.com.lcx.test.Person");//類完整路徑

這樣我們就獲取到了Person類的代碼,Class api可以通過如下方法獲取到 Class對象的構造函數、成員函數、成員屬性等類元素的反射對象。

反射對象類,都在java.refect包總定義,主要有以下3個反射類:

Constructor.class:類中構造函數反射類

Method.class:類中方法反射類

Field.class:類的成員屬性反射類

反射類和普通類一樣都是對共有東西的抽象。

普通的方式訪問成員函數或者成員屬性是通過具體的對象去進行訪問,

而反射是方法/屬性對象針對某個具體對象進行調用或者訪問的,這普通的方式好像是反著的,可能這就是反射的由來吧。

下面舉個簡單的例子進行拋磚引玉

package cn.com.lcx.test;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class Refect {@SuppressWarnings({ "rawtypes", "unchecked" })public static void main(String[] args) throws Exception {//普通方式:實例化對象、調用方法、訪問屬性Person person = new Person("普通人",0);//構造函數調用person.sex = "男";//訪問屬性person.say();//調用方法Class personClass1 = Person.class;//類名.classClass personClass2 = person.getClass();//Person類對象的getClass方法Class personClass3 = Class.forName("cn.com.lcx.test.Person");//類完整路徑//Person類的構造函數反射類對象Constructor personConstructor = personClass1.getConstructor(String.class,int.class);System.out.println("通過反射實例化對象---------");//通過構造函數反射類對象實例化Person類對象Person person1 =(Person) personConstructor.newInstance("張一",1);Person person2 = (Person) personConstructor.newInstance("張二",2);Person person3 = (Person) personConstructor.newInstance("張三",3);person1.say();person2.say();person3.say();System.out.println("通過反射實現對對象成員方法調用---------");//Person類的成員函數反射類對象Method method = personClass2.getMethod("setName",String.class);method.invoke(person1, "李一");method.invoke(person2, "李二");method.invoke(person3, "李三");person1.say();person2.say();person3.say();System.out.println("通過反射實現對成員屬性的訪問---------");//Person類的成員屬性反射類對象Field field = personClass3.getField("sex");//獲取公有屬性/*** 獲取私有屬性或者私有方法用getDeclaredXXX方法,* 如果想訪問私有成員那么該屬性對象或者方法對象要設置setAccessible(true)方法*/Field fieldPrivate = personClass3.getDeclaredField("name");fieldPrivate.setAccessible(true);//設置可以訪問私有屬性fieldPrivate.set(person, "反射人");person.say();field.set(person1, "男人");field.set(person2, "女人");field.set(person3, "人妖");person1.say();person2.say();person3.say();} }

總結

以上是生活随笔為你收集整理的JAVA反射机制初步理解的全部內容,希望文章能夠幫你解決所遇到的問題。

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