如何使用JAVA反射/JAVA反射實例

2020-12-11 百度經驗

JAVA反射技術,在平時我們的開發中雖然很少會用到例如讀取配製文件可能就用到這個技術,但在我們所使用的框架源碼中是經常會用到的。

1、常用舉例:package com.test.instancedemo;class X{};public class GetClassDemo02{ public static void main(String args[]){  Class<?> c1 = null ;  // 指定泛型  Class<?> c2 = null ;  // 指定泛型  Class<?> c3 = null ;  // 指定泛型  try{   // 以下的操作形式是在開發中最常用的一種形式   c1 = Class.forName("com.test.instancedemo.X") ;  }catch(ClassNotFoundException e){   e.printStackTrace() ;  }  c2 = new X().getClass() ;  // 通過Object類中的方法實例化  c3 = X.class ; // 通過類.class實例化  System.out.println("類名稱:" + c1.getName())  ; // 得到類的名稱  System.out.println("類名稱:" + c2.getName())  ; // 得到類的名稱  System.out.println("類名稱:" + c3.getName())  ; // 得到類的名稱 }};

2、反射如何操作對象:package com.test.instancedemo ;class Person{ private String name ; // name屬性 private int age ;  // age屬性 public void setName(String name){  this.name = name ; } public void setAge(int age){  this.age = age ; } public String getName(){  return this.name ; } public int getAge(){  return this.age ; } public String toString(){ // 覆寫toString()方法  return "姓名:" + this.name + ",年齡:" + this.age  ; }};public class InstanceDemo01{ public static void main(String args[]){  Class<?> c = null ;  // 聲明Class對象  try{   c = Class.forName("com.test.instancedemo.Person") ;  }catch(ClassNotFoundException e){   e.printStackTrace() ;  }  Person per = null ; // 聲明Person對象  try{   per = (Person)c.newInstance() ; // 實例化對象  }catch(Exception e){   e.printStackTrace() ;  }  per.setName("LXY") ;  // 設置姓名  per.setAge(30) ;    // 設置年齡  System.out.println(per) ; // 內容輸出,調用toString() }};

3、如何使用反射包package com.test.instancedemo.instancedemo ;import java.lang.reflect.Constructor ; // 導入反射機制包class Person{ private String name ; // name屬性 private int age ;  // age屬性 public Person(String name,int age){  this.setName(name) ;  this.setAge(age); } public void setName(String name){  this.name = name ; } public void setAge(int age){  this.age = age ; } public String getName(){  return this.name ; } public int getAge(){  return this.age ; } public String toString(){ // 覆寫toString()方法  return "姓名:" + this.name + ",年齡:" + this.age  ; }};public class InstanceDemo03{ public static void main(String args[]){  Class<?> c = null ;  // 聲明Class對象  try{   c = Class.forName("com.test.instancedemo.Person") ;  }catch(ClassNotFoundException e){   e.printStackTrace() ;  }  Person per = null ; // 聲明Person對象  Constructor<?> cons[] = null ;  cons = c.getConstructors() ;  try{   per = (Person)cons[0].newInstance("LXY",30) ; // 實例化對象  }catch(Exception e){   e.printStackTrace() ;  }  System.out.println(per) ; // 內容輸出,調用toString() }};

4、使用實例1package com.test.instancedemo.factorydemo ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){   // 覆寫eat()方法  System.out.println("** 吃蘋果"); }};class Orange implements Fruit{ public void eat(){  System.out.println("** 吃橘子") ; }};class Factory{ public static Fruit getInstance(String className){  Fruit fruit = null ;  try{   fruit = (Fruit)Class.forName(className).newInstance() ;  }catch(Exception e){   e.printStackTrace() ;  }  return fruit ; }};public class FactoryDemo01{ public static void main(String args[]){  Fruit f = Factory.getInstance("com.test.instancedemo.factorydemo.Apple") ;  if(f!=null){   f.eat() ;  } }};

4、使用實例2package  com.test.instancedemo.factorydemo ;import java.util.Properties ;import java.io.File ;import java.io.FileOutputStream ;import java.io.FileInputStream ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){   // 覆寫eat()方法  System.out.println("** 吃蘋果"); }};class Orange implements Fruit{ public void eat(){  System.out.println("** 吃橘子") ; }};class Init{ public static Properties getPro(){  Properties pro = new Properties() ;  File f = new File("d:\\fruit.properties") ; // 找到屬性文件  try{   if(f.exists()){ // 文件存在    pro.load(new FileInputStream(f)) ; // 讀取屬性   }else{    pro.setProperty("apple"," com.test.instancedemo.factorydemo.Apple") ;    pro.setProperty("orange"," com.test.instancedemo.factorydemo.Orange") ;    pro.store(new FileOutputStream(f),"FRUIT CLASS") ;   }  }catch(Exception e){}  return pro ; }};class Factory{ public static Fruit getInstance(String className){  Fruit fruit = null ;  try{   fruit = (Fruit)Class.forName(className).newInstance() ;  }catch(Exception e){   e.printStackTrace() ;  }  return fruit ; }};public class FactoryDemo02{ public static void main(String args[]){  Properties pro = Init.getPro() ;  Fruit f = Factory.getInstance(pro.getProperty("apple")) ;  if(f!=null){   f.eat() ;  } }};

6、獲取一個對象的方法package com.test.instancedemo.factorydemo ;import java.lang.reflect.Method ; // 導入構造方法的包import java.lang.reflect.Modifier ; // 導入構造方法的包public class GetMethodDemo{ public static void main(String args[]){  Class<?> c1 = null ;  // 聲明Class對象  try{   c1 = Class.forName("com.test.instancedemo.factorydemo.Person") ; // 實例化對象  }catch(ClassNotFoundException e){   e.printStackTrace() ;  }  Method m[] = c1.getMethods() ; // 取得全部方法  for(int i=0;i<m.length;i++){   Class<?> r = m[i].getReturnType() ; // 得到返回值類型   Class<?> p[] = m[i].getParameterTypes() ; // 取得全部參數的類型   int xx = m[i].getModifiers() ; // 得到修飾符   System.out.print(Modifier.toString(xx) + " ") ; // 輸出修飾符   System.out.print(r + " ") ;   System.out.print(m[i].getName()) ;   System.out.print("(") ;   for(int j=0;j<p.length;j++){    System.out.print(p[j].getName() + " " + "arg" + j) ;    if(j<p.length-1){     System.out.print(",") ;    }   }   Class<?> ex[] = m[i].getExceptionTypes() ; // 取出異常   if(ex.length>0){    System.out.print(") throws ") ;   }else{    System.out.print(")") ;   }   for(int j=0;j<ex.length;j++){    System.out.print(ex[j].getName()) ;    if(j<p.length-1){     System.out.print(",") ;    }   }   System.out.println() ;  } }};

相關焦點

  • java如何通過反射調用方法
    java是一門面向對象的軟體開發語言。大家用java來開發軟體系統,自然是離不開構建對象,執行對象的方法。有時候也會執行類的靜態方法。《java創建對象除了new,還有其他辦法嗎?》這篇文章裡是說的是通過反射獲取構造方法對應的構造器,然後通過構造器來實例化對象。構造方法是方法,普通方法也是方法,那普通方法是不是也有類似的功能,通過反射是不是也能調用方法呢。答案是肯定的。不過和通過反射創建對象還是有一些區別的。
  • Java面試高頻考點:反射機制使用大全
    作為一個Java開發工程師,在面試的過程中,反射機制也是經常會被問到的一個問題。例如Spring的IOC實現機制,其底層都是依賴於java的反射機制,因此,這是一個非常重要的知識點。對於初學java的同學來說,掌握其使用方法很有必要。
  • 一起學JAVA——反射技術
    反射技術是java動態特性的基石,java之所以有很多開發框架就是因為反射技術的存在。什麼是反射JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
  • Java高級特性:反射機制
    概述JAVA反射機制:在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。
  • 阿里P8教你Java註解與反射
    使用反射基本上是一種解釋操作,我們可以告訴JVM,我們想要做什麼然後它滿足我們的要求,這類操作總是慢於直接執行相同的操作。調用實例的方法Student{name='小花', age=0}-----------------------使用實例的屬性Student{name='小紅', age=0}
  • 反射——Java高級開發必須懂得
    一、Class類的使用任何一個類都是Class的實例對象,這個實例對象有三種表示方式1、任何一個類都有一個隱含的靜態成員變量classClass c1=Foo.class;2、已經知道該類的對象通過getClass
  • 程式設計師:什麼是Java反射機制,有什麼作用
    此外,在 ORM 中間件的實現中,運用 Java 反射機制可以讀取任意一個 JavaBean 的所有屬性,或者給這些屬性賦值通過反射機制,可以在運行的時候訪問到對象的屬性、方法、構造方法等等哪些地方用到反射機制?其實我們都用過反射機制,只是並不知道它是反射機制而已。
  • 說說Java的反射機制
    一、什麼是反射動態獲取類的信息以及動態調用對象的方法稱為Java的反射(Reflection)機制。反射提供了封裝程序集、模塊和類型的對象。在Java運行時環境中,對於任意一個類的對象,可以通過反射獲取這個類的信息。
  • Java反射:框架設計的靈魂
    在 Java 中,要使用一個類中的某個方法,「正向」都是這樣的:ArrayList list = new ArrayList(); //實例化  >list.add("reflection");  //執行方法 那麼反向(反射)要如何實現?
  • Java基礎增強篇一,Java核心功能反射機制
    Java反射機制1. java代碼在 java 語言中最核心的就是代碼的運行, 按照面向對象的思想,在調用java代碼時往往需要先創建對象,再調用方法, 而寫在方法中的即所謂的java 代碼先分析Class對象的圖解:
  • Java中反射學習系列教程三-常用API方法
    本文是《Java中反射學習系列教程》中的第三篇文章。本文我們接著之前的講解。先來看看今天學習主要內容:4.2.2 實例化class對象的幾種方式Class對象獲取共有三種方式。註:為什麼獲取父類的時候使用的是class單個對象接收?而獲取接口的時候使用的是class數組接收?從這裡也就解釋了為什麼Java是單繼承多實現了。4.2.4 獲取對象的構造器對象構造器在java中使用Constuctor對象表示的。
  • Java反射,泛型在Json中的運用
    最近項目中遇到了Json數據自動獲取的功能,不然令人想起java的反射,已經很長時間沒複習java了正好一塊連java的這一塊內容一起過一遍。java中的反射無疑就相當於java開發者的春天,在眾多的框架中也能看到它的身影,可以在運行時檢查類,接口、變量和方法等信息,可以實例化調用方法以及設置變量值等。本文主要以代碼的形式直接將反射,泛型的運用展現出來。java中的反射首先新建一個基礎類Author。
  • 強烈推薦:Java的反射機制和使用你們都知道嗎?
    Java中的反射機制和使用想必大家都不是很了解,今天我就和大家一起來認識和學習這些知識點吧,發射這個詞相信大家平時學習時用的不多但聽的很多,特別是在各種開源框架中,很多框架都用到反射機制,hibernate,struts ,spring等框架都是用反射機制實現的。
  • JAVA的反射,你需要了解
    JAVA的反射,是JAVA的核心技術要點。有很多我們耳熟能詳的框架、api,其底層就是使用了java反射功能來實現的。比如jdbc加載不同的資料庫驅動,spring容器加載對象,idea的提示等等。那麼,究竟什麼是JAVA 的反射呢?JAVA反射又是怎樣實現上述功能的呢?一、什麼是JAVA反射?
  • 課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例
    軟體項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作Java中的屬性配置文件主要可以作為軟體應用系統及項目的配置文件,比如許多J2EE的開源框架系統中都提供了屬性配置文件作為該應用框架的對外配置文件
  • get新技能,Java的Class與反射機制原理,讓你寫出更靈活的代碼
    反射機制反射是框架設計的靈魂,java的反射機制就是增加程序的靈活性,避免將代碼寫死在程序裡反射的概述JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性
  • Java編程中基礎反射詳細解析
    類加載的時機創建類的實例的時候訪問類的靜態變量的時候調用類的靜態方法的時候使用反射方式來強制創建某個類或接口對應的java.lang.Class對象初始化某個類的子類的時候直接使用java.exe命令來運行某個主類1.4 類加載器
  • 兩分鐘學會Java反射
    什麼是反射程序在運行中,對任意一個類都能獲取其所有的屬性和方法,並且對任意一個對象都能調用其任意一個方法,這種機制被稱為Java的反射機制。反射的作用我們自己寫代碼的時候,當對一個對象的類型不確定的時候,我們就用反射的機制,來獲取這個對象的信息,我們看下面這個例子。
  • JAVA反序列化 - commons-collections - 1
    *通過反射機制創建一個新的對象實例的轉換器實現我們可以這裡有經典的反射機制調用,在細節分析前我們先整理一下調用棧,但不需要很理解。exec():調用實例的exec函數因為漏洞函數最後是通過反射機制調用任意這個語句先轉化成反射機制如下(後面需要用到):至於如何構造反射機制的語句,參考往期文章java反射機制Class.forName("java.lang.Runtime")
  • Java 內部類的一些實現細節
    這裡的一些文章闡明了一些細節,比如Java編譯器如何生成合成方法,可以使這些成員類訪問(外部類的)私有成員,這在JVM中本來是是不允許的。很容易知道內部類的另一個實現細節:內部類的構造函數需要額外的合成參數。內部類構造函數第一個合成參數就是普遍知道的內部類的外圍實例(的引用),它存儲在this$0 的合成域中。 這是適用於三種內部類:成員,本地和匿名。