「javacglib代理」java动态代理和cglib
本篇文章给大家谈谈javacglib代理,以及java动态代理和cglib对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Spring 中JDKProxy和CGlibProxy的区别
- 2、java cglib性能怎么样
- 3、JAVA中使用final关键字修饰的类能不能被代理,如果能要怎么代理?
- 4、向大神求教,Spring 使用 cglib动态代理问题
Spring 中JDKProxy和CGlibProxy的区别
原理区别: java动态中国是利用反射机制生成一个实现中国接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态中国是利用asm开源包,对中国对象类的class文件加载进来,通过修改其字节码生成子类来处理。 一、如果目标对象实现了接口,默认情况下会采用JDK的动态中国实现AOP 二、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 三、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态中国和CGLIB之间转
java cglib性能怎么样
动态代理对于AOP的实现有着举足轻重的作用,所以理解动态代理的实现对于理解AOP有着很大的帮助。
以下通过代码来描述其实现步骤。
被代理的目标类:TargetObject
import com.test.ITargetObject;
import com.test.ITargetObjectNew;
public class TargetObject implements ITargetObject, ITargetObjectNew {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String doSth(String value) {
String result = "[TargetObject]: doSth(" + value + ")";
System.out.println(result);
if (true)
throw new RuntimeException("heihei");
return result;
}
@Override
public void doAotherThing() {
System.out.println("[TargetObject]: doAotherThing");
}
}
被代理类实现的接口1
package com.test;
public interface ITargetObject {
public abstract String doSth(String value);
}
被代理类实现的接口2
package com.test;
public interface ITargetObjectNew {
public abstract void doAotherThing();
}
1. Java原生代理
主要使用的是Proxy这个接口InvocationHandler
1.1.代理类
package com.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object object, Method method, Object[] param)
throws Throwable {
//以下是添加的额外的方法,这里是before advice
System.out.println("before calling " + method);
Object result = null;
try {
result = method.invoke(target, param);//这里是执行被代理类的方法,也可以添加判断逻辑来确定是否执行该方法
} catch (Exception e) {
//以下是添加的额外的方法,这里是throw advice
System.err.println(e.toString());
}
//以下是添加的额外的方法,这里是after advice
System.out.println("after calling " + method);
return result;
}
}
1.2.客户端
package com.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.test.impl.TargetObject;
public class ProxyClient {
public static void main(String[] args) {
ITargetObject target = new TargetObject();
InvocationHandler proxyHandler=new ProxyHandler(target);
//创建代理对象,注意这里被代理的对象类必须实现至少一个接口
ITargetObject proxy=(ITargetObject)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxyHandler);
//通过代理执行方法
proxy.doSth("guoqiang");
}
}
JAVA中使用final关键字修饰的类能不能被代理,如果能要怎么代理?
final修饰过的类为不可继承类,不能被代理。你去熟悉一下代理模式。首先需要新建一个代理类,然后有个核心类,要代理这个核心类需要能被继承。
向大神求教,Spring 使用 cglib动态代理问题
如果你要代理controller, 在spring mvc的配置文件里面配下aop代理就好了呀 配置如下: package com.szyungu.ecommunity.base.service; import java.util.List; import org.apache.ibatis.annotations.Param; public interface IBaseMapper
关于javacglib代理和java动态代理和cglib的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。