java 反射机制初探

最近再看书时,书中使用了java的动态代理机制,随即在网上搜了些文章看了一下,既然有动态代理那就有静态代理,所谓静态代理,就是在你些的代理类中需要使用到具体的被代理类。而所谓动态代理,则不需要在代理类中使用到被代理类,根本不知道起要代理那个类。在jdk1.3后java加入了动态代理功能的api,动态代理主要用在面向接口编程上,业务逻辑的实现类必须实现某业务接口,通过使用动态代理, 我们可以在代理类中拦截器功能。java的动态代理功能是通过实现java.lang.reflect.InvocationHandler接口来实现的。实现类必须实现接口中定义的invoke方法。下面是一段实现动态代理的代码。

package com.spring;

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

/**
 * 此类用于实现动态代理
 * @author paul
 *
 */

public class LogHandler implements InvocationHandler {

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

 private Object delegate;

 //绑定被代理对象,返回被代理对象所实现的接口
 public Object bind(Object delegate) {
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(), this);
 }

 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  Object result = null;
  try {
   log("method1" + method);
   result = method.invoke(delegate, args);
   logger.log(Level.INFO, "method ends" + method);
  } catch (Exception e) {
   log(e.toString());
  }

  return result;
 }

 private void log(String message) {
  logger.log(Level.INFO, message);
 }

}

 一下是定义业务逻辑方法的

 package com.spring;

public interface IHello {
 public void hello(String name);
}

一下是接口实现类,即业务逻辑实现类

package com.spring;

/**
 * 此类用于实现业务逻辑
 * @author Administrator
 *
 */
public class HelloSpeaker implements IHello {
 /**
  * 实现接口方法
  * @return void
  */
 public void hello(String name) {
  System.out.println("Hello," + name);

 }

}

一下是用于测试的类

package com.spring;

public class ProxyDemo {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // HelloProxy proxy=new HelloProxy(new HelloSpeaker());
  // proxy.hello("paul");
  LogHandler loghandler = new LogHandler();
  IHello helloProxy = (IHello) loghandler.bind(new HelloSpeaker());// 绑定代理对象
  helloProxy.hello("paul");// 该句执行时会调用invoke方法

 }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值