java 动态代理笔记
时间: 2023-10-11 11:17:09 浏览: 292
Java动态代理是一种强大的编程技术,它可以在运行时生成代理类,在代理类中拦截方法调用并执行特定的逻辑。以下是一些Java动态代理的笔记:
1. 实现InvocationHandler接口
Java动态代理需要实现InvocationHandler接口,该接口只有一个方法invoke(Object proxy, Method method, Object[] args),该方法用于处理代理对象上的方法调用。
2. 使用Proxy类创建代理对象
在实现InvocationHandler接口后,可以使用Proxy类的静态方法newProxyInstance()创建代理对象。该方法需要传递三个参数:类加载器、实现的接口和InvocationHandler对象。
3. 代理对象的方法调用
当代理对象的方法被调用时,代理对象会将方法调用转发给InvocationHandler对象。InvocationHandler对象可以在方法调用前后执行额外的逻辑,然后通过反射调用目标对象的方法。
4. 代理对象的限制
Java动态代理只能代理接口,而不能代理类。代理对象的方法调用也必须是通过接口中声明的方法进行调用。
5. 动态代理的应用
Java动态代理可以用于AOP编程、远程调用和缓存实现等场景。例如,在AOP编程中,可以使用动态代理来实现横切关注点的拦截和执行。
以上是Java动态代理的一些笔记,希望对你有帮助。
相关问题
java 静态代理笔记
Java 静态代理是一种常见的设计模式,其主要思想是通过一个代理对象来控制对真实对象的访问,从而增强真实对象的功能或者限制对真实对象的访问。
静态代理的实现需要创建一个代理类和一个真实对象类,代理类和真实对象类都实现同一个接口或者继承同一个父类,代理类中持有真实对象的引用,在代理类的方法中调用真实对象的方法并对其进行增强或者限制。
静态代理的优点是实现简单,可以在不修改真实对象的情况下对其进行增强或者限制,缺点是需要为每一个真实对象类创建一个代理类,工作量较大。
下面是一个简单的静态代理示例:
```java
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("Real Subject Request");
}
}
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("Before Real Subject Request");
realSubject.request();
System.out.println("After Real Subject Request");
}
}
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
```
在上面的示例中,Subject 接口定义了一个 request 方法,RealSubject 类是真实对象类,实现了 Subject 接口的 request 方法,ProxySubject 类是代理类,也实现了 Subject 接口的 request 方法,在其方法中调用了 RealSubject 的 request 方法并对其进行了增强。
在 Main 类中,我们创建了一个 RealSubject 对象和一个 ProxySubject 对象,通过调用 proxySubject 的 request 方法,实际上是调用了它持有的 realSubject 的 request 方法,并对其进行了增强。
注意,在这个示例中,RealSubject 类和 ProxySubject 类都实现了 Subject 接口,这是静态代理的一种常见实现方式。
阅读全文