java 动态代理
目前java动态代理的实现分为两种
1.基于jdk的动态代理
2.基于cglib的动态代理
基于jdk的动态代理
话不多说,直接上图
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class jdktest {
interface Animal {
void eat();
}
static class Dog implements Animal {
public void eat() {
System.out.println("dog eat");
}
}
// JDK 代理类
static class JDKProxy implements InvocationHandler {
private Object realtarget; // 代理对象
public Object getInstance(Object realtarget) {
this.target = target;
// 取得代理对象
return Proxy.newProxyInstance(realtarget.getClass().getClassLoader(), realtarget.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("JDK 动态代理");
// 方法调用
Object result = method.invoke(realtarget, args);
return result;
}
}
public static void main(String[] args) {
// JDK 动态代理调用
JDKProxy proxy = new JDKProxy();
Animal dogProxy = (Animal) proxy.getInstance(new Dog());
dogProxy.eat();
}
}
基于cglib的动态代理
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 test {
static class Cat {
public void eat() {
System.out.println("Cat eat");
}
}
static class CglibProxy implements MethodInterceptor {
private Object realtarget; // 代理对象
public Object getInstance(Object realtarget) {
this.target = target;
Enhancer enhancer = new Enhancer();
// 设置父类为实例类
enhancer.setSuperclass(this.realtarget.getClass());
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib 动态代理");
// 执行方法调用
Object result = methodProxy.invokeSuper(o, objects);
return result;
}
}
public static void main(String[] args) {
// cglib 动态代理调用
CglibProxy proxy = new CglibProxy();
Cat cat = (Cat)proxy.getInstance(new Cat());
cat.eat();
}
}