基于JDK
前提:被代理类必须有接口实现
目的:在不修改源码的前提下,对功能增强
步骤
检查条件,被代理对象是否有接口
获取(getClassLoader)类加载器和(getInterfaces)接口
FangDong fangdong=new FangDong();
ClassLoader classLoader=FangDong.class.getClassLoader();
Class<?> [] interfaces=FangDong.class.getInterfaces();使用反射的工具包,获取被代理接口的实例化类对象
Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){})具体强化代码
IChuZu chuZuproxy=(IChuZu) Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){
public Object invoke(Object proxy, Method method,Object[] args) throws Throwable{
System.out.println(Arrays.toString(args));
Fangzi fangzip=(Fangzi) args[0];
fangzip.setPrice(fangzip.getPrice()*8);
System.out.println(Arrays.toString(args));
Object result=method.invoke(fangdong,args);
return result;
}
});InvocationHandler 是 Java 动态代理机制的核心接口,它的作用可以简单理解为:“拦截代理对象的方法调用,并在调用前后插入自定义逻辑”。
invoke(Object proxy, Method method,Object[] args),method参数是代理方法名称,args是入参
Object result=method.invoke(fangdong,args);主动调用fangdong对象的原始方法
最后使用chuZuproxy.chuzu(fangzi);调用代理对象的方法
完整代码
public class T2 {
public static void main(String[] args) {
Fangzi fangzi=new Fangzi();
fangzi.setName("石家庄");
fangzi.setAdress("河北");
fangzi.setPrice(12000);
FangDong fangdong=new FangDong();
ClassLoader classLoader=FangDong.class.getClassLoader();
Class<?> [] interfaces=FangDong.class.getInterfaces();
IChuZu chuZuproxy=(IChuZu) Proxy.newProxyInstance(classLoader,interfaces,new InvocationHandler(){
public Object invoke(Object proxy, Method method,Object[] args) throws Throwable{
Fangzi fangzip=(Fangzi) args[0];
fangzip.setPrice(fangzip.getPrice()*8);
Object result=method.invoke(fangdong,args);
return result;
}
}
);
chuZuproxy.chuzu(fangzi);
}
}
基于CGlib
与JDK实现的区别就是不用有接口实现也能代理
步骤
导入依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>完整代码
public class T3 {
public static void main(String[] args) {
Fangzi fangzi=new Fangzi();
fangzi.setName("石家庄");
fangzi.setAdress("河北");
fangzi.setPrice(12000);
FangDong fangDong=new FangDong();
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(FangDong.class);
enhancer.setCallback(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("InvocationHandler invoke---");
Fangzi fangzi1=(Fangzi) args[0];
fangzi1.setPrice(fangzi1.getPrice()*2);
Object result= method.invoke(fangDong,args);
return result;
}
});
IChuZu chuZuProxy=(IChuZu) enhancer.create();
chuZuProxy.chuzu(fangzi);
}
}实例化Enhancer()
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(FangDong.class);设置回调enhancer.setCallback(new InvocationHandler(){},具体增强代码里面实现
enhancer.setCallback(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("InvocationHandler invoke---");
Fangzi fangzi1=(Fangzi) args[0];
fangzi1.setPrice(fangzi1.getPrice()*2);
Object result= method.invoke(fangDong,args);
return result;
}
});Object result= method.invoke(fangDong, fangzi1);需要主动调用一次原代码,使用fangDong对象
最后创建代理并且调用方法
IChuZu chuZuProxy=(IChuZu) enhancer.create();
chuZuProxy.chuzu(fangzi);
评论已关闭