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

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

2017-08-18 22:57 281 查看
package top.yuyufeng.test.dynamicProxy;

/**
* created by yuyufeng on 2017/8/18.
*/
public interface HelloService {

String hello(String words);

}


package top.yuyufeng.test.dynamicProxy;

/**
* created by yuyufeng on 2017/8/18.
*/
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String words) {
System.out.println("Hello:" + words);
return "Hello:" + words;
}
}


package top.yuyufeng.test.dynamicProxy;

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

/**
* created by yuyufeng on 2017/8/18.
*/
public class ProxyHandler implements InvocationHandler {
private Object proxied;

public ProxyHandler(Object object) {
this.proxied = object;
}

public Object invoke(Object object, Method method, Object[] args) throws Throwable {
/**
* ①Object proxy:代理对象引用。
* ②Method method:代理类中接受的接口方法。
* ③Object[] args:向代理对象的方法中传递的参数。
*/
System.out.println("<执行方法之前>");
Object result = method.invoke(proxied, args);
System.out.println("<执行方法之后>");
return result;
}
}


使用:

package top.yuyufeng.test.dynamicProxy;

import java.lang.reflect.Proxy;

/**
* created by yuyufeng on 2017/8/18.
*/
public class App {
public static void main(String[] args) {
/**
* ①ClassLoader loader : 定义代理类的类加载器,可获得已知的加载器。
* ②Class<?> interfaces : 希望代理代理实现的接口列表,它可以是多个接口。
* ③InvocationHandler h : InvocationHandler接口的一个具体实现类的对象的引用(需传入被代理类实例对象的引用)。
*/
HelloServiceImpl helloServiceImpl = new HelloServiceImpl();
HelloService helloService = (HelloService) Proxy.newProxyInstance(HelloService.class.getClassLoader(), new Class[]{HelloService.class}, new ProxyHandler(helloServiceImpl));
helloService.hello("yyf");
}
}


执行结果:

<执行方法之前>
Hello:yyf
<执行方法之后>


cglib动态代理方式

package demo;

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

import java.lang.reflect.Method;

/**
* Created by yuyufeng on 2017/8/31.
*/
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();

public Object getProxy(Class clazz) {
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}

@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("后置代理");
return result;
}

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