Java动态代理示例代码

Proxy 提供用于创建动态代理类和实例的静态方法。简洁方法:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

InvocationHandler 是代理实例的调用处理程序 实现的接口。
每个代码实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

对java的动态代理机制有点陌生了,整理一下以前的代码。

package  invocation;

/**
 * 定义一个接口,两个方法
 * 
@author Jessica
 *
 
*/

public   interface  Subject  {
    
public void print(String str);
    
    
public void print2();

}

 

package  invocation;
/**
 * 定义一个类,实现Subject接口
 * 
@author Jessica
 *
 
*/

public   class  RealObject  implements  Subject {

    
public RealObject() {
        
super();
    }

    
public void print(String str){
        System.out.println(
"run into print");
    }

    
    
public void print2(){
        System.out.println(
"run into print2");
    }


}

 

package  invocation;

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

/**
 * 实现InvocationHandler接口,为RealObject对象提供代理(代理类)
 * 
@author Jessica
 *
 
*/

public   class  CallBack  implements  InvocationHandler {

    
private Object obj;

    
public CallBack(Object obj) {
        
this.obj = obj;
    }

    
/**
     * 给对象创建动态代理
     * 
@param obj 需要创建代理的对象
     * 
@return 返回动态代理对象
     
*/

    
public static Object factory(Object obj) {
        Class cls 
= obj.getClass();
        
return Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(), 
new CallBack(obj));
    }

    
/**
     * 在代理实例上处理方法调用并返回结果。
     * 在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
     * @proxy - 在其上调用方法的代理实例
     * @method - 对应于在代理实例上调用的接口方法的 Method 实例
     * @args - 包含传入代理实例上方法调用的参数值的对象数组 
     * @Throwable - 从代理实例上的方法调用抛出的异常
     
*/

    
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj1 
= null;
        System.out.println(
"##########before calling##########");
        
if(method.getName().equals("print")){
            System.out.println(
"args:"+args[0]);
            System.out.println(
"the invoke method is print()");
        }

        
//在代理实例上处理方法调用
        obj1 = method.invoke(obj, args);
        
//返回结果
        return obj1;
    }

}

写完了,测试一下:

 

package  invocation;

/**
 * 触发类-测试
 * 
@author Jessica
 
*/

public   class  Inspiration  {

    
public Inspiration() {
        
super();
    }


    
public static void main(String args[]){
        RealObject realObj 
= new RealObject();
        
//创建代理对象
        Subject subject = (Subject)CallBack.factory(realObj);
        
//方法调用
        subject.print("JESSICA");
        subject.print2();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值