proxy 动态代理 静态代理

什么是代理 就是在不改变原来代码的前提下 为原来的代码增加新的功能

作用解耦

增加可维护性

动态代理和静态代理的区别

动态代理不用频繁的创建代理类

减小消耗  提高性能

动态代理代理的类是活的(可变的) 静态代理是死的(不可变的)

先写静态代理  先死后活,死去活来

首先创建接口

package StaticProxy;

public interface User {
void eat(String eat);
}


然后创实现类

public class UserImp implements User {
@Override
public void eat(String eat) {
System.out.println("我要吃"+eat);
}
}

代理类

public class ProxyUser  implements User{

private UserImp user=new UserImp();

@Override
public void eat(String eat) {
System.out.println("之前增加的");
user.eat(eat);
System.out.println("之后增加的");
}
}

以上就完成了
让我们来测试吧


public class Text {
public static void main(String[] args) {
ProxyUser proxyUser = new ProxyUser();
proxyUser.eat("肉");
}
}

打印结果


之前增加的
我要吃肉
之后增加的

动态代理

首先需要创建一个接口

这个借口代表 需要进行代理的类

public interface TextInt {
public void rent();

public void hello(String str);
}

创建TextInt的实现类


public class  RealSubject implements TextInt{
@Override
public void rent() {
System.out.println("I want to tent my house");
}

@Override
public void hello(String str) {
System.out.println("hello:"+str);
}
}





创建 动态代理类
实现动态代理必须实现InvocationHandler这个接口
并且实现 invoke这个方法
public class DynamicProxy implements InvocationHandler {
//要代理的真实对象
private Object RealSubject;
//赋予真实的对象初值
public DynamicProxy(Object subject) {
this.RealSubject = subject;
}

@Override
//代理类的 对象 方法和参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理对象前我们可以添加一些自己的操作
System.out.println("befor");
System.out.println("Method:"+method);
//当代理对象调用真实对象的方法时,回自己跳转到
//关联的RealSubject对象的invoke方法来进行调用
        Object invoke = method.invoke(RealSubject, args);
// System.out.println("invoker:"+invoke.toString());

//灾之后
System.out.println("after");
return null;
}
}
    

//创建模拟客户端

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
//要代理的真实对象
RealSubject realSubject = new RealSubject();
//蒋旭要代理的真实对象传进去
DynamicProxy handler = new DynamicProxy(realSubject);
//proxy 代理类三个参数

RealSubject subject =
(RealSubject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
System.out.println(subject.getClass().getName());
subject.rent();
subject.hello("王紫辉");
}
}
如此 完成动态代理

猜你喜欢

转载自www.cnblogs.com/lppz/p/10087062.html