JDK动态代理

//1.影星接口
package com.entity;
//影星接口
public interface MovieStar {
public void act();//演戏
}
//2.被代理类----实现一个接口
package com.entity;
//成龙
public class ChengLongStar implements MovieStar{
@Override
public void act() {
System.out.println("我是成龙,我会拍戏");
}
}
//3.代理类----实现InvocationHandler接口
package com.entity;
import java.lang.reflect.InvocationHandler;//java的设计模式
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//成龙的经纪人类
public class ChengLongProxy implements InvocationHandler{
//被代理的原始对象
private Object orientObject;//被代理对象
//绑定被代理对象,返回一个代理对象
public Object bind(Object obj){
this.orientObject=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
//演戏之前要做的事情
public void beforeAct(){
System.out.println("谈档期...");
System.out.println("谈片酬...");
System.out.println("谈广告合作...");
System.out.println("签合同...");
}
//演戏之后要做的事情
public void afterAct(){
System.out.println("出席首映式...");
System.out.println("出席颁奖典礼...");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
beforeAct();
//调用成龙的演戏方法
result=method.invoke(this.orientObject,null);//利用反射调用方法
afterAct();
return result;
}
}
//4.测试类
package com.entity;
import org.junit.Test;
public class ChengLongProxyTest {
@Test
public void fun1(){
//创建成龙对象
MovieStar chengLong=new ChengLongStar();
//成龙经纪人对象
ChengLongProxy proxy=new ChengLongProxy();
//把成龙和成龙经纪人绑定,返回有经纪人的成龙对象
chengLong= (MovieStar) proxy.bind(chengLong);
chengLong.act();
}
}
//结果
谈档期... 谈片酬... 谈广告合作... 签合同... 我是成龙,我会拍戏 出席首映式... 出席颁奖典礼...

CGLIB是借助反编译实现的

1.抽象类
package com.entity;
//影星抽象类
public abstract class MovieStar {
//抽象方法
public abstract void act();//演戏
}
2.被代理类
package com.entity;
//成龙
public class ChengLongStar extends MovieStar{
@Override
public void act() {
System.out.println("我是成龙,我会拍戏");
}
}
3.代理类
package com.entity;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
//成龙的经纪人类
public class ChengLongProxy implements MethodInterceptor {
// 被代理对象
public Object orientObject;//
public Object bind(Object obj) {
this.orientObject = obj;
Enhancer enhancer = new Enhancer();
// 获得被代理对象的父类
enhancer.setSuperclass(obj.getClass().getSuperclass());
enhancer.setCallback(this);
return enhancer.create();// 返回一个代理对象
}
// 演戏之前要做的事情
public void beforeAct() {
System.out.println("谈档期...");
System.out.println("谈片酬...");
System.out.println("谈广告合作...");
System.out.println("签合同...");
}
// 演戏之后要做的事情
public void afterAct() {
System.out.println("出席首映式...");
System.out.println("出席颁奖典礼...");
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
Object result;
beforeAct();
//调用成龙演戏
result=method.invoke(orientObject, null);
afterAct();
return result;
}
}
4.测试结果:
谈档期... 谈片酬... 谈广告合作... 签合同... 我是成龙,我会拍戏 出席首映式... 出席颁奖典礼...


来源:https://www.cnblogs.com/xjs1874704478/p/11212102.html