JDK動態代理,接口代理


 在了解jdk代理之前,我們要知道什么是動態代理?動態代理可以干什么呢?

  在現實生活中有很多代理對象(如明星代理),可以實現真實對象的功能,還在真實對象的基礎上添加了新的功能,保證真實對象沒有被修改。而jdk動態代理就和這個實現原理大概一致。

簡介:

  1. 需要存在抽象對象,定義所有的功能

  2. 真實對象實現抽象對象所有的功能

  3. 通過Proxy類,創建代理對象,調用代理方法

  4. 在InvocationHandler的invoke對代理的方法有選擇的修改或不修改真實對象原有的方法。

抽象角色

package com.it.proxy;
​
/**
 抽象角色:定義功能
 */
public interface Star {
​
    /**
     唱歌
     @param song
     */
    void sing(String song);
​
    /**
     演出
     @param money
     */
    void act(int money);
}

 

 

真實角色

明星只負責唱歌、拍戲。

package com.it.proxy;
​
/**
 真實角色
 */
public class SuperStar implements Star {
    @Override
    public void sing(String song) {
        System.out.println("明星唱:" + song);
    }
​
    @Override
    public void act(int money) {
        System.out.println("明星拍戲出場費:" + money);
    }
}

 

jdk動態代理角色

代理幫助明星收費,查看錢滿不滿足明星的要求。

package com.it.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Fans {

public static void main(String[] args) {
  /*
  使用JDK動態代理,創建代理對象
  參數1:類加載器
  參數2:所有實現的接口
  參數3:方法調用的接口,Star接口中每個方法都會調用一次
  */
  Star s2 = (Star) Proxy.newProxyInstance(
    s1.getClass().getClassLoader(),
    new Class[]{Star.class},
  new InvocationHandler() {
/*
對每個方法進行功能增強
參數1:代理對象,不能直接調用,不然出現遞歸
參數2:每個方法對象,如:sing() act(),每個方法都會調用一次
參數3:方法傳遞的參數,如:歌名
返回值:調用的方法的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  //如果是演出的方法,判斷是否小於1000,如果小於則不演出,否則調用原來的方法
  String methodName = method.getName();
  if ("act".equals(methodName)) {
  //得到演示參數值
  int money = (int) args[0];
  if (money < 1000) {
    System.out.println("費用太低,不演出了");
  return null;
  }
}
  //其它的情況就調用真實對象原來的方法
  return method.invoke(s1, args); //真實對象,方法的參數
  }
});

  //fans請自己喜歡的明星出場唱歌,拍戲   s2.sing(
"只因你太美");
  //費用過低不滿足   s2.act(
500);   } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM