版权声明:有一种生活不去经历不知其中艰辛,有一种艰辛不去体会,不会知道其中快乐,有一种快乐,没有拥有不知其中纯粹 https://blog.csdn.net/wwwzydcom/article/details/82862500
JAVA中jdk的代理模式
public class Test02 {
public static void main (String[] args){
JdkHandler jdkHandler = new JdkHandler(new You());
Marry marry = (Marry) jdkHandler.getProxy();
marry.toMarry();
}
}
package com.sxt;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* java动态代理机制接口:InvocationHandler
* API描述:每一二个动态代理实现InvocationHandler接口 关联一个handler,每个代理类实例关联到一个handler,当我们通过代理对象调用这个方法的时候,这个方法
* 调用就会被转发到InvocationHandler这个接口的invoke方法来调用
*/
public class JdkHandler implements InvocationHandler{
//代理的目标对象
private Object target;
//添加其构造方法
public JdkHandler(Object target) {
this.target = target;
}
/**
*返回动态代理
* 参数1 类加载器 classLoader 定义类哪个classLoader对象对生成的代理对象进行加载
* 参数2 目标对象实现的接口数组 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果哦提供了一组接口给它
* 这个代理对象宣称实现了该接口的多态,这样我就能调用这组接口中的方法了
* 参数3 实现InvocationHandler 接口类对象 表示当我这个动态代理对象在调用方法的时候会关联哪一个Invocation对象上
* @return
*/
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
public void before(){
System.out.println("前进前进!");
}
public void after(){
System.out.println("后退后退!");
}
/**
*
* @param proxy 目标角色
* @param method 调用目标角色的某个方法的method对象
* @param args 调用目标角色接受的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
before();
//当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
result=method.invoke(target,args);
after();
return result;
}
}
引入jar包
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.0</version>
</dependency>
package com.sxt;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibInterceptor implements MethodInterceptor {
private Object target;
public CglibInterceptor(Object target) {
this.target = target;
}
public Object getProxy(){
Enhancer enhancer=new Enhancer();
//设置父类 class
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public void before(){
System.out.println("新郎不要着急,车队正在快速飞奔中...");
}
public void after(){
System.out.println("恭喜您,成功进入人生第二阶段...");
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object result=null;
before();
result= methodProxy.invoke(target,objects);
after();
return result;
}
}
package com.sxt;
public class Test03 {
public static void main (String[] args){
CglibInterceptor cglibInterceptor = new CglibInterceptor(new AccountService());
//java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor不懂
AccountService accountService= (AccountService) cglibInterceptor.getProxy();
accountService.test();
}
}
代码运行时出现
Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor
等待解决