Proxy之代理

来源:互联网 发布:云计算应用市场 编辑:程序博客网 时间:2024/04/28 16:08

Proxy之代理

今天看Spring,对于依赖注入(DI)倒是可以很好的理解,无非就是几种bean的注入管理方式而已,在学过其他的框架之后,这点倒是很好的理解,于是很快学到了Spring Aop

可以说AOP是Spring的核心吧,其Java语言基础便是动态代理,以前学习Java的时候对这个一知半解,

看实例也可以理解,但是总感觉不是很舒服,于是又将Proxy代理机制复习一遍:

以我目前之理解

动态代理方式主要如下:

第一步:代理的是接口

先创建一个接口

public interface Hello {


public void hello(String name);
}

第二步:创建一个实现了接口的类


public class HelloImpl implements Ihello {

@Override
public void hello(String name) {
  
   System.out.println("hello"+name);// TODO Auto-generated method stub

}

}
第三步:就是创建一个代理类了,其中主要使用了一个newInstance()方法:

package pack_01;
import java.util.logging.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogHandler implements InvocationHandler {

private Logger logger=Logger.getLogger(this.getClass().getName());
private Object delegate;


/*
* 主要是使用Proxy.NewProxyInstance()方法来创建一个代理实例
* 建立对象时要告诉代理的接口,要加载的类的加载器,
*
* 绑定要代理的对象@Override
*/

public Object bind(Object delegate)
{
  
   this.delegate=delegate;
   return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),
this);
}

//invoke()方法,代理生成的对象的方法调用时会调用该方法完成,而该方法中的invoke方法否则执行

//代理对象的方法,返回result

public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
   Object result=null;
   try{
    logger.log(Level.INFO,"method starts"+method.getName());
       result=method.invoke(delegate, args);
   
    logger.log(Level.INFO,"method ends"+method.getName());
   
   }
  
   catch(Exception e)
   {
    logger.log(Level.INFO,e.toString());
   }
   // TODO Auto-generated method stub
return result;
}

第四步 测试:

public class ProxyDemo {


public static void main(String args[])
{
   LogHandler loghandler=new LogHandler();
   Ihello s=new HelloImpl();
   Ihello proxy1=(Ihello)loghandler.bind(s);
   proxy1.hello("哈哈");//此时可以调用invoke()方法执行,返回结果
  
}
}

之前看了类加载器以及class.forName()方法,当然也看了newInstance()这一动态创建的方法

感觉proxy就是在动态创建的基础上形成,自己的理解还有不足之处还要继续学习其他的代理模式啊

原创粉丝点击