之前我一直认为,动态代理一直需要接口的实现类,今天在看Openfeign 源码的时候,发现不是这样的. 动态代理不一定需要接口的实现类,单一接口也可以直接实现动态代理.
< 有实现类的动态代理的写法
public class B {
public static void main(String[] args) throws ClassNotFoundException {
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
Object o = Proxy.newProxyInstance(new C().getClass().getClassLoader(), new C().getClass().getInterfaces(), myInvocationHandler);
A a = (A) o;
((A) o).add();
}
}
class C implements A {
@Override
public void add() {
System.out.println("实现类的方式获取");
}
}
class MyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" 哈哈");
return null;
}
}
< 直接加上判断条件的写法
public class B {
public static void main(String[] args) throws ClassNotFoundException {
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(new C());
Object o = Proxy.newProxyInstance(new C().getClass().getClassLoader(), new C().getClass().getInterfaces(), myInvocationHandler);
A a = (A) o;
((A) o).add();
}
}
class C implements A {
@Override
public void add() {
System.out.println("实现类的方式获取");
}
}
class MyInvocationHandler implements InvocationHandler {
Object object1;
MyInvocationHandler(Object object){
this.object1=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (C.class.equals(object1.getClass())){
Object invoke = method.invoke(object1, args);
return invoke;
}
else {
System.out.println(" 哈哈");
}
return null;
}
}