国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java編程反射機制用法入門與實例總結

2024-07-13 10:15:18
字體:
來源:轉載
供稿:網友

本文實例講述了Java編程反射機制用法。分享給大家供大家參考,具體如下:

前言:反射:動態(tài)獲取類 (字節(jié)碼文件 如本篇中的Person.class),并對其成員進行運行。反射在Android應用層的開發(fā)中可能遇到會稍微少一點,但對于想打通底層的小伙伴來說,必須要熟練掌握運用。

實體類

Person.java

package com.sunwenou.reflect;// 包名public class Person {  private String name;  private int age;  public Person() {// 無參  }  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;  }  @Override  public String toString() {    return name+","+age;  }  public void show() { // 空參    System.out.println("show");  }  public void fun(String ss) { // 帶參    System.out.println(ss);  }  public static void function() { // 靜態(tài)    System.out.println("static");  }}

動態(tài)獲取字節(jié)碼文件的方法

本篇中為使博文看起來簡潔,一概拋出Exception,并省略import,下同。

package com.sunwenou.reflect;public class Demo1 {  /**   * 動態(tài)獲取字節(jié)碼文件的方法   * 1:使用Object類提供的 Class getClass()方法   *  這種方法需要對象   * 2:每種數據類型都有一個靜態(tài)的class屬性,這個屬性返回的這種數據類型所屬字節(jié)碼文件對象   *  int.class  Person.class   * 3:使用 Class提供的 forName()方法   *  只需要提供一個字符串,這個字符串由 包名+類名 構成   */  public static void main(String[] args) throws Exception {    //getClaz();    //getCalz2();    getClaz3();  }  //使用 Class提供的 forName()方法  public static void getClaz3() throws Exception {    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person");    System.out.println(claz==claz2);  }  //每種數據類型都有一個靜態(tài)的class屬性  public static void getCalz2() {    Class<Person> p1 = Person.class;    Class<Person> p2 = Person.class;    System.out.println(p1==p2);  }  //使用Object類提供的 Class getClass()方法  public static void getClaz() {    Person person1 = new Person();    Class<? extends Person> claz = person1.getClass();//Person.class    Person person2 = new Person();    Class<? extends Person> claz2 = person2.getClass();//Person.class    System.out.println(claz==claz2);  }}

動態(tài)獲取類,并創(chuàng)建對象

package com.sunwenou.reflect;public class Demo2 {  public static void main(String[] args) throws Exception {    //createObj();    createObj2();  }  public static void createObj2() throws Exception {    //Person person = new Person("lisi",23);    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class    //得到帶參數的構造方法所屬的Constructor類型的對象    Constructor constructor = claz.getConstructor(String.class,int.class);    //使用Constructor類提供的創(chuàng)建對象的方法創(chuàng)建對象    Person person = (Person)constructor.newInstance("lisi",23);    System.out.println(person);  }  public static void createObj() throws Exception {    //Person person = new Person();    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    Object obj = claz.newInstance();//默認使用空參的構造方法創(chuàng)建對象    System.out.println(obj);  }}

動態(tài)獲取類并為成員變量賦值

package com.sunwenou.reflect;public class Demo3 {  public static void main(String[] args) throws Exception {    //Person p = new Person();    //p.name = "lisi";    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    //得到成員變量所屬的Field類型的對象    //Field field = claz.getField("name");//得到的是public權限的成員    Field field = claz.getDeclaredField("name");//得到所有聲明的字段    System.out.println(field);    //非靜態(tài)成員變量是依賴于對象的    Object obj = claz.newInstance();    field.setAccessible(true);//暴力破解, 設置為可訪問的    field.set(obj, "張三");    System.out.println(obj);  }}

動態(tài)獲取類,并執(zhí)行方法

package com.sunwenou.reflect;public class Demo4 {  public static void main(String[] args) throws Exception {    //method1();    method2();    method3();  }  public static void method3() throws Exception {    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    Method m = claz.getMethod("function", null);    m.invoke(null, null);  }  ////執(zhí)行帶參數的方法  public static void method2() throws Exception {    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    Method m = claz.getMethod("fun", String.class);    Object obj = claz.newInstance();    m.invoke(obj, "hello");  }  //執(zhí)行無參的方法  public static void method1() throws Exception {    //Person person = new Person(); person.show();    //得到字節(jié)碼文件對象    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");    //得到被執(zhí)行的方法所屬的字節(jié)碼文件對象    Method m = claz.getMethod("show", null);    //非靜態(tài)方法是依賴于對象的    Object obj = claz.newInstance();    //執(zhí)行方法    m.invoke(obj, null);  }}

這就是反射的基本用法,我們就可以在不能通過正常創(chuàng)建對象的時候通過對象的字節(jié)碼文件來創(chuàng)建對象,并執(zhí)行其中的方法,你學會了嗎??

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 三明市| 大方县| 顺昌县| 肥城市| 富民县| 平谷区| 勃利县| 乌鲁木齐县| 兴山县| 洪雅县| 尉氏县| 永昌县| 磴口县| 田林县| 鄂托克前旗| 湄潭县| 全州县| 获嘉县| 井陉县| 石河子市| 崇礼县| 濉溪县| 漳平市| 新和县| 佛坪县| 普安县| 北票市| 通辽市| 婺源县| 尉犁县| 深水埗区| 青浦区| 永川市| 石泉县| 高清| 五河县| 石嘴山市| 黄陵县| 平顺县| 北流市| 台南市|