Java代理类为什么也要实现同一个接口?

如题,为什么Java的静态代理中,要求代理类和被代理类实现同一个接口呢?生成代理类时,直接将被代理类的对象引用传递给代理类不也可以实现相同的功能吗?

直接将被代理类的对象引用传递给代理类,看起来是可以实现相同的功能,但是实际上会破坏了原来第三方调用的代码。


举个例子:
1、假设 类Cat 继承 接口Animal,并实现了方法 call()

2、第三方调用:
Animal animal = createAnimal(new Cat()); //createAnimal是封装后提供第三方调用的方法
animal.call();

3、createAnimal实现
Animal createAnimal(Animal animal){
...
}


创建代理
1、假设Proxy是新建的代理类,但没有实现Animal接口;

2、第三方调用需要修改:
Proxy animal = createAnimal(new Cat());
animal.call();

3、createAnimal实现需要修改:
Proxy createAnimal(Animal animal){
...
}

如果Proxy实现了Animal接口,则不会出现这种问题。

直接将被代理类的对象引用传递给代理类 :要求是不是需要有继承关系?
有继承关系的无非两种方式:
1.实现接口 这就是jdk动态代理的实现方式
2.子类继承父类 这就是 cglib的代理实现方式

jdk静态代理的目的是在主业务代码的前后新增一些非业务处理,如:记录日志,事务处理等。
实现静态代理的前提:
1、代理类和被代理类实现了同一接口
2、被代理类需要实现具体继承接口中的方法
3、代理类调用的是具体类中的方法(也就是说代理类中需要接受一个被代理类的对象)

代理类不实现同一个接口,就没有代理类的意义了,跟普通函数调用有什么区别呢。代理类只有继承了接口,在加载的时候,程序才能知道代理类和被代理类之间的对应关系。才能做出相应的处理。
如有帮助,望【采纳】。

你看看源码就知道了。为什么代理类能够调用到被代理类的方法,就是因为生成代理类的时候,通过反射拿到了接口里面定义的方法