應用反射進行開發
反射機制:執行狀態中,對於任何一個類(class檔案),都知道此類的所有屬性和方法;對於任何一個物件,能呼叫任意一個屬性和方法。簡言之:動態獲取類中資訊。
1 反射執行機制
程式首先根據類名得到類名.class檔案,然後載入進記憶體裡;建立該位元組碼檔案物件;緊接著建立該位元組碼內部對應的具體類物件。
2 應用程式如何反射
通過解析.class檔案,獲取位元組碼中的物件資訊。反射通過Class類完成,該類提供了獲取位元組碼檔案中的內容,包括屬性(欄位)、方法等。
想要對一個類檔案進行解剖,只要獲得該類的位元組碼檔案物件即可。
3 獲取位元組碼檔案物件的三種方法
3.1 利用Object類中的getclass()方法。
以類Car為例,講述如何獲取Car.class位元組碼檔案物件。
Car{
motor;
battery;
Car(){}
show1(){}
show2(){}
}
public static void getClassObject1(){
Car car=new Car();
Class clas=car.getclass();
}//獲得Car位元組碼物件後,clas就可以呼叫Car類中的屬性和方法了。這種方式需要明確具體的類,並建立物件。實際開發中採用較少。
3.2 任何資料型別(基本+引用)都具備靜態屬性.class來獲取對應的class物件。
public static void getClassObject2(){
Class clas=Car.class;
}//同樣的效果。這種方式比第一種要高效,但還明確用到類中的靜態成員。
3.3 只要通過給定的類名字串(必須含包名),通過Class.forName(“”)獲取類物件。
pubic static void getClassObject3(){
String name="cn.ishuai.viechle.Car";//帶包名的類Car
Class clas=Class.forName(name);
}//一樣的效果。這種方式只要給出類名,就可獲得位元組碼檔案物件,實際開發中最常用。
4 Tomcat如何利用反射進行開發
5 自己實現的反射Demo
具體程式碼:
package cn.ishuai.viechle;//該包主要實現Car類和Common介面
public class Car {
public String Motor="DO";//發動機型別:柴油縮寫DO
public int Battery=2;//蓄電池個數
public Car(){
System.out.println("無參建構函式初始化");
}
public Car(String motor,int battery){
this.Motor=motor;
this.Battery=battery;
System.out.println("含參建構函式初始化");
}
public void show1(){
System.out.println("Motor:"+Motor+" "+"Battery:"+Battery);
}
public void setShow(String moto,int batt){
Motor=moto;
Battery=batt;
System.out.println("Motor:"+moto+" "+"Battery:"+batt);
}
// private void show3(){
// System.out.println("私有方法show3被呼叫了");
// }
public void useCommon(Common com){
com.open();
com.close();
}
}
----------
package cn.ishuai.viechle;
public interface Common {
public void open();
public void close();
}
package cn.ishuai.reflect;//該包首先用Light和DiDi實現了Common介面。然後通過
import cn.ishuai.viechle.Common;
public class Light implements Common{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("車燈亮啦……");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("車燈關閉……");
}
}
----------
package cn.ishuai.reflect;
import cn.ishuai.viechle.Common;
public class DiDi implements Common {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("喇叭響啦……");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("喇叭停止……");
}
}
----------
package cn.ishuai.reflect;//main檔案
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
import java.lang.reflect.Method;
import cn.ishuai.viechle.Car;
import cn.ishuai.viechle.Common;
public class Test {
public static void getFieldDemo() {
Class clas=Class.forName("cn.ishuai.viechle.Car");
Field fieldMotor=clas.getField("Motor");//只能獲取公有的,即使是友元的也獲取不到
Field fieldBattery=clas.getField("Battery");
Object obj=clas.newInstance();
fieldMotor.set(obj, "特斯拉");
fieldBattery.set(obj, 10);
Object o1 = fieldMotor.get(obj);
Object o2=fieldBattery.get(obj);
System.out.println("Motor:"+o1+" "+"Battery"+o2);
}
public static void getMethodDemo() throws {
Class clas=Class.forName("cn.ishuai.viechle.Car");
Method method=clas.getMethod("show1", null);
Object obj=clas.newInstance();
method.invoke(obj, null);
}
public static void getMethodDemoParameter(){
Class clas=Class.forName("cn.ishuai.viechle.Car");
Method method=clas.getMethod("setShow", String.class,int.class);
//Constructor cons=clas.getConstructor(String.class,int.class);
Object obj=clas.newInstance();
method.invoke(obj, "小米汽車",8);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car=new Car();
//car.setShow("qiyou2",4);//不用new的方式建立新物件
//car.useCommon(new Light());
File configFile = new File("common.propertites");
Properties prop = new Properties();//要熟悉propertites的用法
FileInputStream file = new FileInputStream(configFile);
prop.load(file);//
for(int x=0; x<prop.size(); x++){
String commonName = prop.getProperty("common"+(x+1));
Class clazz = Class.forName(commonName);//用Class去載入這個Common子類,返回common的名字
Common p = (Common) clazz.newInstance();//newInstance()返回的是object,需要強轉為介面Common,做引數用
car.useCommon(p);
}
file.close();
//getFieldDemo();
//getMethodDemo();
//getMethodDemoParameter();
//getMethodDemoPrivate();
}
}
可執行程式碼連結:
相關文章
- 基於PostgreSQL進行Java應用開發SQLJava
- 怎樣使用AJAX進行應用程式開發(轉)
- 輕應用介紹 - 用JavaScript進行嵌入式開發JavaScript
- 【iOS開發】如何用 Swift 語言進行LBS應用的開發?iOSSwift
- 用Delphi進行word開發
- dotnet core使用開源元件FastHttpApi進行web應用開發元件ASTHTTPAPIWeb
- Android應用開發進階Android
- 基於雲資料庫MongoDB版進行應用開發資料庫MongoDB
- python開發華為雲應用側進行裝置接入Python
- 反射的應用反射
- 使用 Java 進行移動應用開發的 8 個理由 - VikrantJava
- .Net開發筆記(二十一) 反射在.net中的應用筆記反射
- Java反射的應用Java反射
- 使用SemanticKernel 進行智慧應用開發(2023-10更新)
- 採用測試驅動開發理念(Test Driven Development)進行 SAP UI5 應用的功能開發(一)devUI
- 採用測試驅動開發理念(Test Driven Development)進行 SAP UI5 應用的功能開發(二)devUI
- 反射機制及應用反射
- Web | 淺談用Python進行Web開發WebPython
- 用 Swift 模仿 Vue + Vuex 進行 iOS 開發(一):ReSwiftSwiftVueiOS
- java反射技術的應用Java反射
- 1.1.4 應用開發
- 開發Web應用Web
- 用C++進行Windows驅動開發的一些進展C++Windows
- 用 Swift 模仿 Vue + Vuex 進行 iOS 開發(二):CoordinatorSwiftVueiOS
- 用NowGenerator V3.0進行DNN模組開發DNN
- 00024.06 反射:反射的應用2:動態建立物件反射物件
- 使用應用程式(Java/Python)訪問MaxCompute Lightning進行資料開發JavaPython
- 百度腦圖解析:如何進行web複雜應用的漸進式開發圖解Web
- 反射和代理的具體應用反射
- Go語言反射(reflect)及應用Go反射
- Java 反射機制應用實踐Java反射
- Java反射機制應用實踐Java反射
- 使用Devstack進行開發dev
- 使用容器Docker進行開發Docker
- 使用 Devstack 進行開發dev
- 進行佛家專案開發
- 行為驅動開發在 Python 開發測試中的應用Python
- 漸進式web應用開發---promise式資料庫(五)WebPromise資料庫