专业的JAVA编程教程与资源

网站首页 > java教程 正文

JAVA中代理模式和动态代理(java中代理模式和动态代理的区别)

temp10 2024-10-04 12:33:12 java教程 12 ℃ 0 评论

代理模式

代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

代理的分类

静态代理

JAVA中代理模式和动态代理(java中代理模式和动态代理的区别)

直接指定了代理角色和被代理对象的关系

动态代理

不指定被代理的对象,根据程序自动去寻找。

JDK中带有一个 动态代理,第三方也提供了动态代理

jdk:

必须提供一个interface

代理角色类必须实现InvocationHandler接口

publicclass MyInvocationHandler implements InvocationHandler {

private Object target;

public MyInvocationHandler (Object target){

this.target = target;

}

//必须实现这个方法

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

return method.invoke(target, args);

}

public Object getProxy() {

return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),

target.getClass().getInterfaces(), this);

}

}

//启动一个类的main方法就可以测试

public static void main(String[] args){

// 实例化目标对象 ,必须实现接口

UserService userService = new UserServiceImpl();

// 实例化InvocationHandler

MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);

// 根据目标对象生成代理对象

UserService proxy = (UserService) invocationHandler.getProxy();

// 调用代理对象的方法

proxy.add();

}

第三方

第三方提供的就是Cglib,String的aop在无接口类的拦截的时候就用的是这个

需要引入

cglib的jar包

同样代理类需要实现MethodInterceptor接口

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 arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {

//通过代理类调用父类中的方法

Object result = proxy.invokeSuper(arg0, arg2);

return result;

}

}

启动main方法调用

public static void main(String[] args) {

CglibProxy proxy = new CglibProxy();

//自定义的一个普通类

TestHello proxyImp = (TestHello)proxy.getProxy(TestHello.class);

proxyImp.sayHello();

}

代理技术所引申出来的代理模式在很多框架和地方都有使用,例如上面提到的spring的aop模块,mybaties框架中都用到,这块还是蛮有意思的,值得研究研究。


小记:这篇文章是《深入理解java虚拟机》最后一篇文章了,但只是告一段落,不会结束,以后如果发现还有需要补充的,依然会再重新阅读,每次阅读都有不同的收获。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表