JDK动态代理简单小程序 (一)

2014-11-24 10:38:28 · 作者: · 浏览: 2

[java] Jdk动态代理

1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。
  原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦

使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。

代码来说明
  首先创建一个类来实现InvocationHandel
  
package cn.csdn.service;

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

//动态代理实现
public class LogInterceptor implements InvocationHandler {
// 被代理对象
private Object target;

public Object getTarget() {
return target;
}

  // 通过往里面设置值来确定被代理的对象
public void setTarget(Object target) {
this.target = target;
}

public void beforeMethod() {
System.out.println("拦截的功能");
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod();
// 调用被代理的对象 target是传过来的那个接口 args是接口所对应的类
method.invoke(target, args);
return null;
}
}

然后再创建代理类对象
@Test
public void test() {
//被代理对象 把这个接口对应的方法加上逻辑 是它要进行代理
UserDao userDao = new UserDaoImpl();

//实现了InvocationHander的接口的类
LogInterceptor logInterceptor = new LogInterceptor();
logInterceptor.setTarget(userDao);

//三个参数 (classLoader, 被代理对象都实现类哪些接口,进行代理的类)
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),new Class[]{UserDao.class}, logInterceptor);
userDaoProxy.addUser();
userDaoProxy.delete();
}
注:new Class[]{UserDao.class} 和 UserDao.getClass().getInterfaces()是一样的,前者是数组,肯定定义多个接口,后者是定义一个接口

UserDao和UsreDaoImpl中就是放了两个方法,分别为addUser(),delete()

UserDao接口
public interface UserDao {
public void addUser();
public void delete();
}

UserDaoImpl类
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("添加啦=======");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("删除操作==");
}
}

Junit测试的结果为:
拦截的功能
添加啦=======
拦截的功能
删除操作==

Jdk动态代理

1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。
  原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦

使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。

代码来说明
  首先创建一个类来实现InvocationHandel
  
package cn.csdn.service;

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

//动态代理实现
public class LogInterceptor implements InvocationHandler {
// 被代理对象
private Object target;

public Object getTarget() {
return target;
}

  // 通过往里面设置值来确定被代理的对象
public void setTarget(Object target) {
this.target = target;
}

public void beforeMethod() {
System.out.println("拦截的功能");
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod();
// 调用被代理的对象 target是传过来的那个接口 args是接口所对应的类
method.invoke(target, args);
return null;
}
}

然后再创建代理类对象
@Test
public void test() {
//被代理对象 把这个接口对应的方法加上逻辑 是它要进行代理
UserDao userDao = new UserDaoImpl();

//实现了InvocationHander的接口的类
LogInterceptor logInterceptor = new LogInterceptor();
logInterceptor.setTarget(userDao);

//三个参数 (classLoader, 被