jdk动态代理:
JDK动态代理是在运行时直接生成类的字节码,并载入到java虚拟机执行,所以就没有class文件。
必须要有接口实现类!!!
来个例子:
接口 chickenWings
package test;
public interface chickenWings {
public void grillingChickenWings();
}
实现接口的类 chickenWingsImpl
package test;
public class chickenWingsImpl implements chickenWings{
public void grillingChickenWings() {
// TODO Auto-generated method stub
System.out.println("烤鸡翅ing...");
}
}
代理类 jdkProxyTest
Invoke方法, 它的三个参数:
第一个参数 proxy 表示动态代理类实例。
第二个参数 method 表示调用的方法。
第三个参数 args 表示调用方法的参数。
public <T> T getProxy()方法里边的return:
第一个参数是类加载器,用于加载这个代理类。
第二个参数是Class数组,里面存放的是待实现的接口信息。
第三个参数是一个InvocationHandler的实例,在这个例子里面就是this。
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class jdkProxyTest implements InvocationHandler{
private Object target;
public jdkProxyTest(Object target) {
this.target = target;
}
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Grilling ChickenWings before");
Object result = method.invoke(target, args);
System.out.println("Grilling ChickenWings after");
return result;
}
}
测试类 testProxy:
package test;
public class testProxy {
public static void main(String[] args) {
// TODO Auto-generated method stub
//生成的字节码保存到文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
// jdk动态代理测试
chickenWings wings = new jdkProxyTest(new chickenWingsImpl()).getProxy();
wings.grillingChickenWings();
}
}