歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

面向切面編程和面向對 勞務派遣管理系統 象變成相比到底有什么好處呢

點擊: 次  來源:寶鼎軟件 時間:2017-08-26

原文出處: ZIWENXIE

Java反射機制是一個很是強大的成果,在許多大型項目好比Spring, Mybatis中都可以瞥見反射的身影。通過反射機制我們可以在運行期間獲取工具的范例信息,操作這一特性我們可以實現工場模式和署理模式等設計模式,同時也可以辦理Java泛型擦除等令人苦惱的問題。本文我們就從實際應用的角度出發,軟件開發,來應用一下Java的反射機制。

反射基本

p.s: 本文需要讀者對反射機制的API有必然水平的相識,假如之前沒有打仗過的話,發起先看一下官方文檔的Quick Start。

在應用反射機制之前,首先我們先來看一下如何獲取一個工具對應的反射類Class,在Java中我們有三種要領可以獲取一個工具的反射類。

通過getClass要領

在Java中,每一個Object都有一個getClass()要領,通過getClass要領我們可以獲取到這個工具對應的反射類:

String s = "http://www.ziwenxie.site";
Class<?> c = s.getClass();

通過forName要領

我們也可以挪用Class類的靜態要領forName():

Class<?> c = Class.forName("java.lang.String");

利用.class

可能我們也可以直接利用.class:

Class<?> c = String.class;

獲取范例信息

在文章開頭我們就提到反射的一大長處就是可以答允我們在運行期間獲取工具的范例信息,下面我們通過一個例子來詳細看一下。

首先我們在typeinfo.interfacea包下面新建一個接口A:

package typeinfo.interfacea;
public interface A { void f(); }

接著我們在typeinfo.packageaccess包下面新建一個類C,類C實現了接口A,而且我們還別的建設了幾個用于測試的要領,留意下面幾個要領的權限都是差異的。

package typeinfo.packageaccess;
import typeinfo.interfacea.A;
class C implements A {
    public void f() { System.out.println("public C.f()"); }
    public void g() { System.out.println("public C.g()"); }
    protected void v () { System.out.println("protected C.v()"); }
    void u() { System.out.println("package C.u()"); }
    private void w() { System.out.println("private C.w()"); }
}
public class HiddenC {
    public static A makeA() { return new C(); }
}

在callHiddenMethod()要領中我們用到了幾個新的API,個中getDeclaredMethod()按照要領名用于獲取Class類指代工具本身聲明的某個要領,然后我們通過挪用invoke()要領就可以觸發工具的相關要領:

package typeinfo;
import typeinfo.interfacea.A;
import typeinfo.packageaccess.HiddenC;
import java.lang.reflect.Method;
public class HiddenImplementation {
    public static void main(String[] args) throws Exception {
        A a = HiddenC.makeA();
        a.f();
        System.out.println(a.getClass().getName());
        // Oops! Reflection still allows us to call g():
        callHiddenMethod(a, "g");
        // And even methods that are less accessible!
        callHiddenMethod(a, "u");
        callHiddenMethod(a, "v");
        callHiddenMethod(a, "w");
    }
    static void callHiddenMethod(Object a, String methodName) throws Exception {
        Method g = a.getClass().getDeclaredMethod(methodName);
        g.setAccessible(true);
        g.invoke(a);
    }
}

從輸出功效我們可以看出來,不管是public,default,protect照舊private要領,通過反射類我們都可以自由挪用。雖然這里我們只是為了顯示反射的強大威力,軟件開發,在實際開拓中這種能力照舊不倡導。

public C.f()
typeinfo.packageaccess.C
public C.g()
package C.u()
protected C.v()
private C.w()

上面我們只是測試了Method工具,感樂趣的讀者在熟悉了反射的API之后,不妨測試一下Filed,這里我們就不反復了。

操作動態署理實現面向切面編程

AOP是Spring提供的一個強大特性之一,AOP的意思是面向切面編程,就是說要疏散和業務不相關的代碼,當我們需要新增相關的事務的時候,我們不想要對業務自己做修改。面向切面編程和面向工具釀成對比到底有什么長處呢,我們通過一個例子來看一下,對付新手來說,經常會寫出下面這樣的代碼:

public class Example1 {
    public void execute() {
        // 記錄日志
        Logger logger = Logger.getLog(...);
        // 舉辦機能統計
        PerformanceUtil.startTimer(...);
        // 權限查抄
        if (!user.hasPrevilege()) {
            // 拋出異常
        }
        // 執行真正的業務
        executeTransaction();
        PerformanceUtil.endTimer();
    }
}
排列三305组选前后关系 上海天天彩选4历史开奖结果 广西快乐十分群 pk10赛车6码345678公式 网上股票配资平台牛壹佰赞a 山西体彩十一选五任选 广东十一选五开奖查询 我查云南十一选五开 辽宁福彩35选7下期预测 快三大小单双技巧揭秘 广东好彩1几点开奖