Java中动态代理与静态代理的区别示例
在Java中,动态代理和静态代理的主要区别在于创建代理对象的方式以及代理行为的控制。
- 动态代理:
- 创建方式:通过反射API动态生成一个字节码类,并且这个类继承自目标接口。
- 代理行为:动态代理实现的是方法级别的代理,也就是说对于每个目标方法,都会有一个对应的代理方法来处理请求。
示例代码(使用JDK的Proxy和InvocationHandler):
// 目标接口
interface Target {
void doSomething();
}
// 目标类
class TargetImpl implements Target {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 静态代理类(继承自目标接口,实现InvocationHandler接口)
class StaticProxy implements Target, InvocationHandler {
private Target target;
// 创建时注入目标对象
public StaticProxy(Target target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method execution...");
// 调用目标方法(需要转换为Target对象)
Object result = target.method(method, args));
System.out.println("After method execution...");
return result;
}
}
// 创建代理对象
Target proxy = (Target) Proxy.newProxyInstance(
Target.class.getClassLoader(),
new Class[]{Target.class},
new StaticProxy()
);
// 测试代理方法
proxy.doSomething();
- 静态代理:
- 创建方式:在编译阶段,通过javac工具自动为每个目标方法生成对应的代理代码。
- 代理行为:静态代理实现的是类级别的代理,也就是说对于每个目标类,都会有一个对应的代理类来处理请求。
示例代码(使用JDK的Class和Method对象):
// 目标类
class TargetClass {
void doSomething() {
System.out.println("Doing something...");
}
}
// 静态代理类
class StaticProxyClass extends TargetClass {
@Override
public void doSomething() {
// 在静态代理类中添加自定义行为
System.out.println("Before doing something...");
// 调用目标方法(需要转换为TargetClass对象)
super.doSomething();
System.out.println("After doing something...");
}
}
总的来说,动态代理和静态代理的主要区别在于代理对象的创建方式以及代理行为控制的粒度。
还没有评论,来说两句吧...