//业务接口
public interface PersonService {
String sayHello();
}
//业务接口实现类
public class PersonServiceImpl implements PersonService {
@Override
public String sayHello() {
SimpleDateFormat formatter = new SimpleDateFormat();
System.out.println("hello," + formatter.format(new Date()));
return formatter.format(new Date());
}
}
- 静态代理
public class StaticProxyService implements PersonService {
private PersonService personService;
public StaticProxyService(PersonService personService) {
this.personService = personService;
}
@Override
public String sayHello() {
System.out.println("静态 增强");
return personService.sayHello();
}
}
- jdk动态代理
public class JdkProxyService {
public static Object getInstance(Object target){
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
PersonServiceImpl.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk 增强");
Object invoke = method.invoke(target, args);
return invoke;
}
});
return proxy;
}
}
- cglib动态代理
public class CglibProxyService {
public static Object getInstance(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
System.out.println("cgliab 增强");
//不能使用method.invoke ,否在会再次进入intercept,造成死循环
return methodProxy.invokeSuper(o, objects);
});
return enhancer.create();
}
}
4.测试
public class ProxyTest {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static void test1() {
StaticProxyService proxyService = new StaticProxyService(new PersonServiceImpl());
proxyService.sayHello();
}
public static void test2() {
PersonServiceImpl personService = new PersonServiceImpl();
PersonService proxy = (PersonService) JdkProxyService.getInstance(personService);
proxy.sayHello();
}
public static void test3() {
PersonService personService = new PersonServiceImpl();
PersonService proxy = (PersonService)CglibProxyService.getInstance(personService);
proxy.sayHello();
}
}
运行结果
5.总结
- jdk动态代理: 被代理对象类必须实现接口;
- cglib动态代理: cglib是通过生成子类代理, 被代理对象可以是未实现接口的类,但不能用final修饰;
jdk动态生成的代理类
public final class $Proxy0 extends Proxy implements PersonService {
private static Method m1;
private static Method m3;
private static Method m2;
private static Method m0;
public $Proxy0(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String sayHello() throws {
try {
return (String)super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m3 = Class.forName("com.hateapple.study.jichu.proxy.PersonService").getMethod("sayHello");
m2 = Class.forName("java.lang.Object").getMethod("toString");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}