天天看點

黑馬程式員—代理

------- android教育訓練、java教育訓練、期待與您交流! ----------

1,JVM可以在運作期動态生成出類的位元組碼,這種動态生成的類往往被用作代理類,即動态代理類。

2,JVM生成的動态類必須實作一個或多個接口,是以,JVM生成的動态類隻能用作具有相同接口的目标類的代理。

3,CGLIB庫可以動态生成一個類的子類,一個類的子類也可以用作該類的代理,是以,如果要為一個沒有實作接口的類生成動态代理類,那麼可以使用CGLIB庫。

4,代理類的各個方法中通常除了要調用目标的相應方法和對外傳回目标傳回的結果外,還可以在代理方法中的如下四個位置加上系統功能代碼:

(1)在調用目标方法之前

(2)在調用目标方法之後

(3)在調用目标方法之後 

(4)在處理目标方法 異常的catch塊中

這是我對以上4個小點的總結:其實這4個小點并不用記,在程式設計的時候根據自己的思想,覺得目标方法需要放在哪裡你就可以把它放在哪裡。

5,這個圖我覺得畫得很好,就把它截了下來,看了一目了然

黑馬程式員—代理

6,下面這個問題是黑馬論壇裡面一個同學貼出來的,據他所說這是他在網上看到一個面試題,我看了後就覺得這個就是在考代理的程式設計思想

題目:執行個體一個巨大但有限容量的map,當元素數量達到上限後,新加入的對象映射關系将替換最近不常用的對象映射關系。

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

public class MainClass {

public static void main(String[] args) {

MyMap myMap = new MyMap(3);// 定義上限為3,當然這個可以把上限定義得很大,我這裡是為了友善測試

for (int i = 10, j = 100; i < 20; i++, j++) {

myMap.put(i, j);// 放入鍵值對

myMap.get(10);// 使用鍵為10的鍵值對

myMap.get(11);// 使用鍵為11的鍵值對

myMap.get(15);// 使用鍵為15的鍵值對

}

}

}

class MyMap {

private Map map = null;

private int toplimit;// 上限

public MyMap(int toplimit) {

this.toplimit = toplimit;

map = new HashMap();// map指向一個HashMap對象

}

public void put(Object key, Object value) {

Set<key> set = map.keySet();// map中的所有鍵放入一個set中

System.out.println("放入");

if (map.size() == toplimit) {// 達到上限

System.out.println("Map對象的容量已達到上限");

if (!set.contains(key)) {// 如果這個鍵是新放入的則執行下面的代碼

int minAccessTimes = ((Key) set.toArray()[0]).accessTimes;

for (Object k : set) {

if (minAccessTimes > ((Key) k).accessTimes) {

minAccessTimes = ((Key) k).accessTimes;// 取出通路量最少的次數

}

}

for (Key k : set) {

if (minAccessTimes == k.accessTimes) {// 前面找出的最少 的次數來找到對應的鍵

map.remove(k);// 移出這個鍵值對

break;

}

}

}

}

map.put(new Key(key), value);// 放入新的鍵值對

for (Key k : set) {

System.out.println(k.key + "," + map.get(k).toString() + ","

+ k.accessTimes);

}

}

public Object get(Object key) {

System.out.println("使用");

Set<key> set = map.keySet();

Object value = null;

for (Key k : set) {

if (k.key.equals(key)) {

++k.accessTimes;// 每使用一次通路量加1

value = map.get(key);

}

}

for (Key k : set) {

System.out.println(k.key + "," + map.get(k).toString() + ","

+ k.accessTimes);

}

return value;

}

class Key {

private int accessTimes = 0;// 存放這個鍵值對的通路量

private Object key = null;// 存放原始的鍵

public Key(Object key) {

this.key = key;

}

}

}

</key></key>

7,個人對代理的看法:

看了張老師所講的動态代理後,我就覺得這個動态代理不能濫用,當你要對一個對象中的多個方法提供相同的額外操作時,就可以使用動态代理,如果你隻對部分方法提供額外的操作,并且這些操作又各不相同,那這個時候再用動态代理的話就降低了程式的性能,并且在代碼的編寫量上程式員也沒撿到便宜,因些我認為當隻對部分方法提供額外的操作,并且這些操作又各不相同時,還不如自己寫一個代理類,就比如說上面那道題,我就是自己寫的一個代理類,個人覺得對于這個問題用動态代理并不合适

------- android教育訓練、java教育訓練、期待與您交流! ----------