java动态代理和cglib

java动态代理:

接口

package com.sjc.service;

public interface UserManagerService{
	public void addUser();
}

业务实现类

package com.sjc.service.impl;

import com.sjc.service.UserManagerService;

public class UserManagerServiceImpl{
	@Override
	public void addUser(){
		System.out.println("添加一个普通用户");
	}
}

代理类

package com.sjc.service.proxy;

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

public class UserManagerProxy implements InvocationHandler{
	
	private Object obj;
	
	public UserManagerProxy(Object obj){
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		System.out.println("time start : " + System.currentTimeMillis());
		Object obj = method.invoke(o, args);
		System.out.println("time end : " + System.currentTimeMillis());
		return obj;
	}
}

测试类

package com.sjc.service.test;

import java.lang.reflect.Proxy;

import com.sjc.service.impl.UserManagerServiceImpl;
import com.sjc.service.UserManagerService;

public class InvokeTest {
	
	public static void main(String []args){
		UserManagerProxy userManagerProxy = new UserManagerProxy(new UserManagerServiceImpl());
		UserManagerService userManagerService = (UserManagerService)Proxy.newProxyInstance(UserManagerServiceImpl.class.getClassLoader(), UserManagerServiceImpl.class.getInterfaces(), userManagerProxy);
		userManagerService.addUser();
		System.out.println(userManagerService.getClass().getName());
	}
}

cglib的动态代理

接口类的编写

package my.cglib;

public interface UserManagerService {
	public void addUser();
	public void deleteUser();
}

实现类的编写

package my.cglib;

public class UserManagerServiceImpl implements UserManagerService{

	@Override
	public void addUser() {
		System.out.println("Add One User");
	}
	
	@Override
	public void deleteUser() {
		System.out.println("Delete One User");
	}

}

MethodInterceptor接口的实现

package my.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class UserManagerProxy implements MethodInterceptor{

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
			System.out.println("begin time" + System.currentTimeMillis());
			Object o = proxy.invokeSuper(obj, args);
			System.out.println("end time" + System.currentTimeMillis());
			return o;
			
	}
}

工厂类

package my.cglib;

import net.sf.cglib.proxy.Enhancer;

public class UserManagerFactory {
	
	public static UserManagerService getInstance(UserManagerProxy poxy){
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(UserManagerServiceImpl.class);
		enhancer.setCallback(poxy);
		return (UserManagerService)enhancer.create();
	}

}

测试类

package my.cglib;

public class Client {
	
	public static void main(String args[]){
		UserManagerService userService = UserManagerFactory.getInstance(new UserManagerProxy());
		userService.addUser();
		userService.deleteUser();
	}
}

如果不需要对deleteUser()方法进行代理的话,需要进行如下操作

实现CallbackFilter接口

package my.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.CallbackFilter;

public class UserManagerFilter implements CallbackFilter{
	
	@Override
	public int accept(Method method) {
		if("deleteUser".equals(method.getName())){
			return 1;
		}else{
			return 0;
		}
	}

}

修改工厂类:

package my.cglib;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

public class UserManagerFactory {
	
	public static UserManagerService getInstance(UserManagerProxy poxy){
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(UserManagerServiceImpl.class);
		enhancer.setCallbacks(new Callback[] { poxy, NoOp.INSTANCE });
		enhancer.setCallbackFilter(new UserManagerFilter());
		return (UserManagerService)enhancer.create();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值