您的位置:首页 > 编程语言 > Java开发

Java 动态代理实现的两种方式

2018-01-12 17:28 435 查看
java编程中实现动态有两种方式

方式1: 通过JDK实现, 这里主要用到 java.lang.reflect.InvocationHandler, 这个接口, 实现代码如下:

*注意: 使用jdk实现动态代理, 被代理对象必须实现了某些接口.

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

public class ProxyFactory implements InvocationHandler
{
private Object delegate;

public Object bind(Object delegate)
{
this.delegate = delegate;
return Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),   // 获取当前类加载器
delegate.getClass().getInterfaces(),       // 获取当前类实现的接口列表
this);                         // InvocationHandler接口实现类对象
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{

// 在执行代理对象方法之前需要做的事情, 数据校验, 权限控制等等
System.out.println("before: " + Instant.now().getEpochSecond());

// 通过反射执行代理对象的方法
Object invoke = method.invoke(delegate, args);

// 执行代理对象方法之后需要做的事情, 例如释放一些特定支援等等
System.out.println("after: " + Instant.now().getEpochSecond());
return invoke;
}
}


调用:

public interface IUserService
{
void add(String name, int age);
}

public class UserServiceImpl implements IUserService
{
@Override
public void add(String name, int age)
{
System.out.println("添加用户");
}
}


public class DemoApplicationTests
{

@Test
public void testProxy()
{
IUserService userService = (IUserService)new ProxyFactory().bind(new UserServiceImpl());

userService.add("", 100);
}
}

执行结果:



方式2: 通过 CGLIB 来实现动态代理, 实现代码:

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.time.Instant;

public class CglibFactory implements MethodInterceptor
{
private Object object;

public Object bind(Object object)
{
this.object = object;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.object.getClass());
enhancer.setCallback(this);
return enhancer.create();
}

@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable
{
System.out.println("before: " + Instant.now().getEpochSecond());
Object newObj = methodProxy.invokeSuper(o, objects);
System.out.println("after: " + Instant.now().getEpochSecond());
return newObj;
}
}

import com.example.demo.proxy.CglibFactory;
import com.example.demo.serviceimpl.UserServiceImpl;
import com.example.demo.serviceinterface.IUserService;
import org.junit.Test;

public class DemoApplicationTests
{

@Test
public void testProxy()
{
IUserService userService2 = (IUserService)new CglibFactory().bind(new UserServiceImpl());

userService2.add("", 3);
}
}

输入结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: