静态代理
首先 我们要明确什么是代理: 代理对象执行的方法实际上是目标对象的方法,例如 经纪人代理明星打理事务, 律师代理委托人进行法律维护
静态代理的使用规则:
一: 目标对象和代理对象继承同一个父类或者接口,我们新建一个公共的接口
public interface BaseInterface {
String sava();
String pring();
}
二 目标对象(真实对象) 实现接口方法;
public class Student implements BaseInterface {
@Override
public String sava() {
return "这是一个保存方法";
}
@Override
public String pring() {
return "这是一个打印方法";
}
}
三 代理对象必须要和目标对象继承同一个父类或实现同一个接口
/**
* 代理类 用来代理studentd 对象
*/
public class StudentProxy implements BaseInterface{
private Student sd;
public StudentProxy(Student sd){
this.sd = sd;
}
@Override
public String sava() {
return sd.sava();
}
@Override
public String pring() {
System.out.println("扩充");
System.out.println(sd.pring());
System.out.println("增强");
return null;
}
}
代理不仅可以代理目标对象的方法,还能对目标对象的方法进行扩充和增强。
静态代理缺点也很明显:
1.一百个对象 就需要写一百个代理,造成大量代码冗余
2.需要提前知道代理对象,灵活性不强
3 代理对象需要实现目标对象的接口,再次造成代码冗余;
所以针对这种情况 我们就需要使用动态代理
动态代理之JDK代理
jdk代理的代理目标依然需要实现接口 和上面一样,
动态代理的代理对象由代理工厂进行构建。
代理工厂:
/**
* 工厂代理类
*/
public class Proxyfactory {
private Object object;
public Proxyfactory(Object object){
this.object = object;
}
//给目标对象生成代理对象
public Object getProxyInstance(){
return Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
return method.invoke(object, args);
}
}
);
}
}
object.getClass().getClassLoader(),: 类构造器
object.getClass().getInterfaces(),:通过类获取其所继承的接口
new InvocationHandler(): object : 代理对象
method: 方法
args: 参数
实现类
public class Test1 {
public static void main(String[] args) {
Student s = new Student();
StudentProxy studentProxy =new StudentProxy(s);
System.out.println(studentProxy.sava() + "----------" +studentProxy.pring() + "------------" + studentProxy.adb() );
}
}
输出结果为
注意:
由于java 是不允许多继承的,所以jdk 代理 不能代理类