- 首先是接口和接口的实现类
接口
public interface A {
public void print();
public void println();
}
接口实现类
public class AImpl implements A {
@Override
public void print() {
System.out.println("A");
}
@Override
public void println() {
System.out.println("A ln");
}
}
- 以下代理和动态代理都是以这两个类为基础
- 代理,代理可以不需要接口
代理类
public class ProxyA {
private AImpl obj;
//和被代理类一样的方法
private void pre() {
if(obj == null) {
obj = new AImpl();
}
}
//和被代理类一样的方法
public void print() {
pre();
obj.print();//代理被代理类来执行它的方法,并且还可以做其他事情
}
public void println() {
pre();
obj.println();
}
}
测试
public class ProxyDemo {
public static void main(String[] args) {
ProxyA pa = new ProxyA();
pa.print();
pa.println();
}
}
- 动态代理
动态代理类
public class DynamicProxyA implements InvocationHandler {
private Object obj;//Object 引用
public DynamicProxyA(Object obj) {
this.obj = obj;
}
//必须重写这个方法,并代理执行方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(obj, args);
}
}
测试
public class DynamicProxyDemo {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("com.qhf.proxy.AImpl");
Object instance = clazz.newInstance();
//注意向下强转为接口类型,疑问点!!!
//1.手动实现InvocationHandler 接口的类并传参
A a = (A)Proxy.newProxyInstance(
clazz.getClassLoader(),
clazz.getInterfaces(),
new DynamicProxyA(instance));
a.print();
a.println();
//2.匿名内部类传参
A a2 = (A)Proxy.newProxyInstance(
clazz.getClassLoader(),
clazz.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(instance, args);
}
});
a2.print();
a2.println();
//3.分解步骤
Class<?> cls = Proxy.getProxyClass(clazz.getClassLoader(), clazz.getInterfaces());
Constructor<?> con = cls.getConstructor(InvocationHandler.class);
A a3 = (A) con.newInstance(new DynamicProxyA(instance));
a3.print();
a3.println();
}
}