什么是代理 就是在不改变原来代码的前提下 为原来的代码增加新的功能
作用解耦
增加可维护性
动态代理和静态代理的区别
动态代理不用频繁的创建代理类
减小消耗 提高性能
动态代理代理的类是活的(可变的) 静态代理是死的(不可变的)
先写静态代理 先死后活,死去活来
首先创建接口
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("王紫辉");
}
}
如此 完成动态代理