java中静态代理和动态代理的区别?
时间: 2024-01-14 12:02:48 浏览: 64
Java中的代理分为静态代理和动态代理两种。静态代理需要自己写代理类并一一实现目标方法,且代理类必须实现与目标对象相同的接口。而动态代理不需要自己实现代理类,JDK动态代理是JRE提供的类库,可以直接使用,不依赖第三方。动态地在内存中构建代理对象(需要我们传入被代理类),并且默认实现所有目标方法。动态代理通过使用反射,动态地获取抽象接口的类型,从而获取相关特性进行代理。因此,动态代理能够为所有的委托方进行代理。
相关问题
Java 静态代理和动态代理
Java 中的代理模式分为静态代理和动态代理两种类型,它们主要用于控制对目标对象的访问、增强其功能或提供额外的行为。
1. **静态代理**:
- 静态代理是预先定义好一个类作为目标对象的代理,代理类在编译时就已经知道目标对象的确切类型。
- 在代理类中,创建目标对象实例并封装在其方法中,当调用代理的方法时,实际上是执行代理类中的相应代码。
- 缺点是无法针对未知的目标类创建代理,如果需求发生变化,需要修改代理类,不够灵活。
2. **动态代理**:
- 动态代理是由 Java.lang.reflect包中的 Proxy 类和 InvocationHandler 接口提供的,可以在运行时动态生成代理对象。
- 创建代理对象时,需要提供一个实现了 InvocationHandler 接口的实例,该实例在代理方法被调用时会被调用,从而实现动态地拦截和修改方法行为。
- 动态代理提供了更大的灵活性,因为它可以处理任何实现了特定接口的目标对象,并且可以动态添加新的行为。
java 静态代理 动态代理
以下是Java中静态代理和动态代理的介绍和示例:
静态代理:
静态代理是在编译期间就已经确定代理类的代码,需要为每一个被代理的类编写一个代理类。静态代理的优点是简单易懂,缺点是需要手动编写代理类,当被代理的类增加方法时,代理类也需要相应地修改。
示例代码:
假设有一个接口`Subject`和它的实现类`RealSubject`,我们需要为`RealSubject`类创建一个代理类`ProxySubject`,并在代理类中调用`RealSubject`类的方法。
```java
// 接口
public interface Subject {
void request();
}
// 实现类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
// 代理类
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("ProxySubject request");
realSubject.request();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
```
动态代理:
动态代理是在运行时动态生成代理类的代码,不需要事先知道代理类的代码。Java中的动态代理主要有两种形式,一种是基于接口的动态代理,另一种是基于类的动态代理。其中,基于接口的动态代理使用较为广泛。
示例代码:
假设有一个接口`Subject`和它的实现类`RealSubject`,我们需要为`RealSubject`类创建一个动态代理类,并在代理类中调用`RealSubject`类的方法。
```java
// 接口
public interface Subject {
void request();
}
// 实现类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
// 动态代理类
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("DynamicProxy request");
Object result = method.invoke(target, args);
return result;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
dynamicProxy);
proxySubject.request();
}
}
```
阅读全文