java 動態代理

  代理模式是基礎的代理模式之一。經常使用的AOP,日誌都是代理模式現象的。在不改變原來的類或者方法的前提下,對外提供增值服務。java

java 實現代理的方式ide

  1)代理分靜態代理,測試

  2)jdk動態代理,this

  3)Cglib動態代理。spa

靜態代理實現方式代理

  代碼靜態代理,主要經過繼承相同的接口日誌

java jdk 動態代理實現方式code

  java jdk 動態代理。主要是實現 InvocationHandler 接口便可對象

舉個例子blog

package proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public interface User { void getNmae(); void getAge(); /** * 獲取工資 * @return
     */
    int getSarly(int month); }
View Code

實現類

package proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class RealUser implements User { public void getNmae() { System.out.println("my name is xiaoming"); } public void getAge() { System.out.println("my age is 14"); } public int getSarly(int month) { return month+200; } }
View Code

代理實現:增長日誌

package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class DynamicProxy implements InvocationHandler { private Object user; public DynamicProxy(Object user) { this.user = user; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before rent house"); System.out.println("Method:" + method); // 當代理對象調用真實對象的方法時,其會自動的跳轉到代理對象關聯的handler對象的invoke方法來進行調用
 method.invoke(user, args); //  在代理真實對象後咱們也能夠添加一些本身的操做
        System.out.println("after rent house"); return null; } }
View Code

 

測試類:

package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * @author ZHONGZHENG664 * @date 2018/8/31. */
public class TestProxy { public static void main(String[] gars) { RealUser realUser = new RealUser(); DynamicProxy dynamicProxy = new DynamicProxy(realUser); User user = (User) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), realUser.getClass().getInterfaces(), dynamicProxy); System.out.println(user.getClass().getName()); user.getAge(); user.getNmae(); System.out.println("my sarly:"+user.getSarly(80)); } }
View Code
相關文章
相關標籤/搜索