Java 动态代理
自定义静态代理:相对于动态代理不灵活。
反射动态代理: 相比较静态代理要灵活,自己实现反射。
JDK动态代理:基于反射实现,目标对象必须要有接口。生成的代理类是接口的一个实现类。
CGLib动态代理:CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高,比JDK动态代理效率稍低(与JDK版本有关),但目标对象不需要有接口。生成的代理类是目标类的子类,因此目标类不能是final的。CGLib动态代理
1 静态代理
自定义静态代理:接口类
public interface Hello {
public String hello(String hello);
}
静态代理:接口实现类
package com.xu.statics.proxy;
public class HelloImpl implements Hello {
@Override
public String say(String str) {
return "静态代理:" + str;
}
}
静态代理:代理类
package com.xu.statics.proxy;
/**
* 静态代理
* @author hyacinth
*
*/
public class StaticProxy implements Hello{
private Hello hello = new HelloImpl();
@Override
public String say(String str) {
return hello.say(str);
}
}
静态代理:测试类
package com.xu.statics.proxy;
/**
* 测试类
* @author hyacinth
*
*/
public class Test {
public static void main(String[] args) {
StaticProxy proxy = new StaticProxy();
System.out.println(proxy.say("111111")); ;
}
}
2 JDK动态代理
JDK动态代理:接口类
package com.xu.jdk.proxy;
interface Hello {
String say(String str);
}
JDK动态代理:接口实现类
package com.xu.jdk.proxy;
public class HelloImpl implements Hello {
@Override
public String say(String str) {
// TODO Auto-generated method stub
return "JDK代理:" + str;
}
}
JDK动态代理:代理类
package com.xu.jdk.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* JDK 原生动态代理
* @author hyacinth
*
*/
public class DycProxy implements InvocationHandler {
private Hello hello;
public DycProxy(Hello hello) {
this.hello = hello;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equalsIgnoreCase("say")) {
System.out.println("DycProxy:" + Arrays.toString(args));
}
return method.invoke(hello, args);
}
}
JDK动态代理:测试类
package com.xu.jdk.proxy;
import java.lang.reflect.Proxy;
/**
* 测试类
* @author hyacinth
*
*/
public class Test {
public static void main(String[] args) {
Hello hello = (Hello) Proxy.newProxyInstance(
Hello.class.getClassLoader(),
new Class<?>[] {Hello.class},
new DycProxy(new HelloImpl()));
System.out.println(hello.say("111111"));
}
}
3 CGLIB动态代理
CGLIB动态代理:被代理类
package com.xu.cglib.proxy;
public class Hello {
public String say(String str){
return "CGLIB代理:" + str;
}
}
CGLIB动态代理:CGLIB动态代理处理类
public class ProxyHander implements InvocationHandler {
private Object target;
public Object createProxyObject(Object target) {
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
CGLIB动态代理:测试类
package com.xu.cglib.proxy;
import net.sf.cglib.proxy.Enhancer;
public class Test {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Hello.class);
enhancer.setCallback(new DycProxy());
Hello hello = (Hello)enhancer.create();
System.out.println(hello.say("111111"));
}
}