Java反射机制剖析:简单谈谈动态代理

开发 后端
通过《Java反射机制剖析:定义和API》和《Java反射机制剖析:功能以及举例》的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制。

通过《Java反射机制剖析:定义和API》《Java反射机制剖析:功能以及举例》的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制。

1. 代理模式

代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途。

它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

2. 分类

代理类按照创建时期可以分为两种,静态代理类和动态代理类。

静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理类:在程序运行时,运用反射机制动态创建而成。

3. 静态代理和动态代理举例

静态代理:

 

业务接口类:

package com.bjpowernode.pattern;  
 
public interface UserManager {  
 
    public void addUser(String userId, String userName);  
      
    public void delUser(String userId);  
      
    public void modifyUser(String userId, String userName);  
      
    public String findUser(String userId);  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

业务接口实现类:

package com.bjpowernode.pattern;  
 
public class UserManagerImpl implements UserManager {  
 
    public void addUser(String userId, String userName) {  
        //System.out.println("start-->>addUser() userId-->>" + userId);  
        try {  
            System.out.println("UserManagerImpl.addUser() userId-->>" + userId);  
              
            //System.out.println("success-->>addUser()");  
        }catch(Exception e) {  
            e.printStackTrace();  
            //System.out.println("error-->>addUser()");  
            throw new RuntimeException();  
        }     
    }  
 
    public void delUser(String userId) {  
        System.out.println("UserManagerImpl.delUser() userId-->>" + userId);  
    }  
 
    public String findUser(String userId) {  
        System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
        return "张三";  
    }  
 
    public void modifyUser(String userId, String userName) {  
        System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId);  
    }  
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

业务代理类:

package com.bjpowernode.pattern;  
 
public class UserManagerImplProxy implements UserManager {  
 
    private UserManager userManager;  
      
    public UserManagerImplProxy(UserManager userManager) {  
        this.userManager = userManager;  
    }  
      
    public void addUser(String userId, String userName) {  
        try {  
            System.out.println("start-->>addUser() userId-->>" + userId);  
            userManager.addUser(userId, userName);  
            System.out.println("success-->>addUser()");  
        }catch(Exception e) {  
            e.printStackTrace();  
            System.out.println("error-->>addUser()");  
        }     
    }  
 
    public void delUser(String userId) {  
 
    }  
 
    public String findUser(String userId) {  
        return null;  
    }  
 
    public void modifyUser(String userId, String userName) {  
 
    }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

客户端类:

package com.bjpowernode.pattern;  
 
public class Client {  
 
    /**  
     * @param args  
     */ 
    public static void main(String[] args) {  
        //UserManager userManager = new UserManagerImpl();  
        UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());  
        userManager.addUser("0001""张三");  
    }  
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

运行结果:

start-->>addUser() userId-->>0001 
UserManagerImpl.addUser() userId-->>0001 
success-->>addUser() 
  • 1.
  • 2.
  • 3.

动态代理:

业务接口类:

package com.bjpowernode.pattern;  
 
public interface UserManager {  
 
      
    public String test(String userId);  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

业务接口实现类:

package com.bjpowernode.pattern;  
 
public class UserManagerImpl implements UserManager {  
 
    public String test(String userId) {  
        System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
        return "张三";  
    }  
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

BusinessHandler类:

package com.bjpowernode.pattern;  
 
import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
 
public class BusinessHandler implements InvocationHandler {  
      
    private Object targetObject;  
      
    public Object newProxyInstance(Object targetObject) {  
          
        this.targetObject = targetObject;  
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
                               targetObject.getClass().getInterfaces(), this);  
    }  
      
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        System.out.println("start-->>" + method.getName());  
        for (int i=0; i<args.length; i++) {  
            System.out.println(args[i]);  
        }  
        Object ret = null;  
        try {  
            //调用目标方法  
            ret = method.invoke(targetObject, args);  
            System.out.println("success-->>" + method.getName());   
        }catch(Exception e) {  
            e.printStackTrace();  
            System.out.println("error-->>" + method.getName());  
            throw e;  
        }  
        return ret;  
    }  
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

客户端类:

package com.bjpowernode.pattern;  
 
import java.lang.reflect.Field;  
 
 
public class Client {  
 
    /**  
     * @param args  
     */ 
    public static void main(String[] args) {  
          
        BusinessHandler businessHandler = new BusinessHandler();  
        UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl());  
          
          
          
        //userManager.addUser("0001", "张三");  
        //userManager.delUser("0001");  
       // System.out.println(userManager.getClass().getName());  
          
        String name = userManager.test("0001");  
    //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001");  
        System.out.println("Client.main() --- " + name);  
    }  
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

运行结果:

start-->>test  
0001 
UserManagerImpl.findUser() userId-->>0001 
success-->>test  
Client.main() --- 张三  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

原文链接:http://blog.csdn.net/lfsf802/article/details/7239766

【编辑推荐】

  1. Java反射机制剖析:功能以及举例
  2. Java反射机制剖析:定义和API
  3. Java远程方法调用RMI
  4. Java处理字符串搜索嵌套结构的方法
  5. Java编程:常见问题汇总
责任编辑:林师授 来源: lfsf802的博客
相关推荐

2012-02-08 10:37:42

Java反射

2012-02-08 09:44:52

Java反射

2010-09-17 12:39:51

JAVA反射机制

2012-02-08 09:53:25

Java反射

2015-09-28 15:59:00

Java动态代理机制

2012-07-09 14:25:04

程序集加载

2020-04-27 07:28:00

Java反射动态代理

2015-09-24 08:55:14

Java动态代理扩展

2015-09-24 08:54:36

java动态代理

2010-04-21 09:26:54

Java动态代理

2010-04-01 09:22:38

代理模式Java反射机制

2020-12-28 07:47:35

动态代理AOP

2009-08-27 16:29:18

C#动态编译

2023-10-17 09:26:44

Java工具

2012-04-05 13:50:38

Java

2011-04-06 11:41:25

Java动态代理

2011-03-09 09:11:52

java反射机制

2017-03-24 09:44:33

Java反射机制

2017-05-17 15:28:15

Java反射机制

2011-09-27 10:23:24

Java反射机制
点赞
收藏

51CTO技术栈公众号