因为jdk动态代理生成的class文件已经继承了Proxy,而java是单继承的,所以是基于jdk动态代理是基于接口的。
请看代码使用jdk动态代理生成class文件
先定义一个文件
public interface Dao {
public void query1() ;
public void query2() ;
}
public static void main(String[] args) {
Class<?>[] interfaces = new Class[]{Dao.class} ;
byte[] bytes = ProxyGenerator.generateProxyClass("Sss", interfaces);
File file = new File("E:\\Sss.class") ;
FileOutputStream fo = null;
try {
fo = new FileOutputStream(file);
fo.write(bytes);
fo.flush();
fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
生成的Class文件
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
public final class Sss extends Proxy implements Dao {
private static Method m1;
private static Method m2;
private static Method m4;
private static Method m0;
private static Method m3;
public Sss(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void query2() throws {
try {
super.h.invoke(this, m4, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void query1() throws {
try {
super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m4 = Class.forName("com.luban.dao.Dao").getMethod("query2");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
m3 = Class.forName("com.luban.dao.Dao").getMethod("query1");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}
可以明显的看到class文件已经继承了Proxy,所以不能继承目标对象,只能实现目标对象,所以jdk动态代理是基于接口而不是继承实现的。