java 设计模式-----代理模式
最近经常被人问到代理模式,好好研究一下,如何实现相关过程吧
代理模式
- java 代理模式 基本思想
- java 代理模式 实现方式
- java代理模式 具体运用
java 代理模式 基本思想
代理模式就是不去修改代码增加功能,对原先的类和方法进行扩展。
java 代理模式 实现方式
静态代理:
实现方法是直接可以写一个代理类,在调用方法的时候通过代理类进行记录相关的操作
动态代理:
jdk 动态代理
参考//blog.csdn.net/jiankunking/article/details/52143504
首先jdk的动态代理只能代理接口,而且aop优先使用jdk的动态代理,代理使用到接口InvocationHandle 接口,实现他的invoke的方法,向里面传类及参数数组代理类的信息
下面是具体的实例
/** * @{#} JdkCat.java Create on 2020年9月10日 上午10:51:51 * * Copyright (c) 2013 by Logan. */
package test.aop.jdk;
/** * @author jiangcl * @version 1.0 * @desc */
public interface JdkCat {
public void eat();
public String run(int times);
}
/** * @{#} JdkActionProxy.java Create on 2020年9月10日 上午10:50:57 * * Copyright (c) 2013 by Logan. */
package test.aop.jdk;
/** * @author jiangcl * @version 1.0 * @desc */
public class JdkActionProxy implements JdkCat{
public void run() {
System.out.println("run 方法执行了");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("eat 方法执行了");
}
@Override
public String run(int times) {
// TODO Auto-generated method stub
System.out.println("eat 方法执行了:"+times);
return "sccess";
}
}
/** * @{#} InvocationHandlerImple.java Create on 2020年9月10日 上午10:57:21 * * Copyright (c) 2013 by Logan. */
package test.aop.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/** * @author jiangcl * @version 1.0 * @desc */
public class InvocationHandlerImple implements InvocationHandler{
public JdkCat jdkCat;
public InvocationHandlerImple(JdkCat jdkCat){
this.jdkCat = jdkCat ;
}
public void before() {
System.out.println("before 执行力");
}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
// TODO Auto-generated method stub
this.before();
System.out.println("执行的方法:"+arg1.getName());
if(arg2!=null) {
for(int i = 0;i<arg2.length;i++) {
System.out.println(arg2[i]);
}
}
Object value = arg1.invoke(jdkCat, arg2);
this.after();
return value;
}
public void after() {
System.out.println("after 执行力");
}
}
/** * @{#} JdkProxyTest.java Create on 2020年9月10日 上午10:51:21 * * Copyright (c) 2013 by Logan. */
package test.aop.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/** * @author jiangcl * @version 1.0 * @desc */
public class JdkProxyTest {
public static void main(String[] args) {
JdkCat jdkCat = new JdkActionProxy();
InvocationHandler invocationHandler = new InvocationHandlerImple(jdkCat);
ClassLoader loader = jdkCat.getClass().getClassLoader();
Class[] interfaces = jdkCat.getClass().getInterfaces();
JdkCat jdkCat1 = (JdkCat) Proxy.newProxyInstance(loader, interfaces, invocationHandler);
System.out.println(jdkCat1.getClass().getName());
// 有参数
jdkCat1.run(66);
// 无参数
jdkCat1.eat();
}
}
cglib 代理
相关代码:
/** * @{#} Dog.java Create on 2020年9月10日 下午2:49:02 * * Copyright (c) 2013 by Logan. */
package test.aop.cglib;
/** * @author jiangcl * @version 1.0 * @desc */
public class Dog {
public void eat(String arg) {
System.out.println("eat 方法执行了,吃:"+arg);
}
public void run() {
System.out.println("run 方法执行了");
}
}
/** * @{#} MyMethodInterceptor.java Create on 2020年9月10日 下午2:59:51 * * Copyright (c) 2013 by Logan. */
package test.aop.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/** * @author jiangcl * @version 1.0 * @desc */
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println("方法开始.....");
System.out.println(arg1.getName());
if(arg2!=null) {
for(int i = 0;i<arg2.length;i++) {
System.out.println(arg2[i]);
}
}
Object object = arg3.invokeSuper(arg0, arg2);
System.out.println("方法结束.....");
return object;
}
}
/** * @{#} CglibTest.java Create on 2020年9月10日 下午3:08:42 * * Copyright (c) 2013 by Logan. */
package test.aop.cglib;
import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
/** * @author jiangcl * @version 1.0 * @desc */
public class CglibTest {
public static void main(String[] args) {
//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\java\\java_workapace");
//创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
Enhancer enhancer = new Enhancer();
//设置目标类的字节码文件
enhancer.setSuperclass(Dog.class);
//设置回调函数
enhancer.setCallback(new MyMethodInterceptor());
//这里的creat方法就是正式创建代理类
Dog proxyDog = (Dog)enhancer.create();
//调用代理类的eat方法
proxyDog.eat("shi");
proxyDog.run();
}
}
还没有评论,来说两句吧...