zoukankan      html  css  js  c++  java
  • 动态代理

    前面讲了静态代理,有明显的缺陷。。动态代理可以解决代理对象不需要实现接口的情况,但是必须要求目标对象应该有实现的接口,才能用动态代理对功能进行扩展



    接口类 IStudent

    1 package cn.secol.dynamic_proxy;
    2 
    3 public interface IStudent {
    4     void  learn();
    5 }
    IStudent

    目标对象类StudentImp

     1 package cn.secol.dynamic_proxy;
     2 /**
     3  * 目标对象
     4  * @author Administrator
     5  *
     6  */
     7 public class StudentImp implements IStudent {
     8 
     9     @Override
    10     public void learn() {
    11         System.out.println("演示动态代理");
    12     }
    13 
    14 }
    StudentImp

     代理对象ProxyFactory

     1 package cn.secol.dynamic_proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 public class ProxyFactory {
     8     //维护一个目标对象
     9     private Object target;
    10 
    11     public ProxyFactory(Object target) {
    12         this.target = target;
    13     }
    14     public Object getProxyInstance(){
    15         return Proxy.newProxyInstance(
    16                 target.getClass().getClassLoader(),//类加载器
    17                 target.getClass().getInterfaces(),//接口类型
    18                 new InvocationHandler() {
    19                     
    20                     @Override
    21                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    22                         System.out.println("处理前code###");
    23                         
    24                         Object returnValue = method.invoke(target, args);
    25                         
    26                         System.out.println("处理后code###");
    27                         return returnValue;
    28                     }
    29                 });
    30     }    
    31 }
    ProxyFactory

     测试类TestDemo

     1 package cn.secol.dynamic_proxy;
     2 
     3 import org.junit.Test;
     4 
     5 /**
     6  * 测试类
     7  * @author Administrator
     8  *
     9  */
    10 public class TestDemo {
    11     
    12     @Test
    13     public void fun1(){
    14         //创建目标对象
    15         IStudent stu = new StudentImp();
    16         //创建代理对象
    17         IStudent proxy = (IStudent) new ProxyFactory(stu).getProxyInstance();
    18         proxy.learn();
    19     }
    20 }
    TestDemo

     运行结果:

  • 相关阅读:
    最常用和最难用的控件--ListView(Android第一行代码)
    LayoutInflater的使用
    JAVA的网络编程【转】
    Android 程序调试
    android Log日志使用
    Android Animation
    实现ImageView宽度填满屏幕
    Android ViewPager使用详解
    对另一个布局文件里的Button按钮进行监听
    如何在一个Activity里使用另一个xml布局文件
  • 原文地址:https://www.cnblogs.com/csong7876/p/7851142.html
Copyright © 2011-2022 走看看