java代理模式:静态代理VS动态代理
一.静态代理:静态代理说白了就是在程序运行前就已经存在代理类的字节码文件,代理类和原始类的关系在运行前就已经确定。
静态代理的特点:1.目标对象即被代理对象一定要实现接口;2.代理对象,要实现与目标对象一样的接口。
//接口
public interface UserDAO {
void save();
}
//目标对象即被代理类
public class IUserDAO implements UserDAO {
public void save(){
do something....
}
}
//代理类与被代理类要实现同一个接口
public class Proxy implements UserDAO {
private UserDAO userDAO = new IUserDAO();public void save(){
userDAO.save();//执行的是目标对象的方法
do something....
}
}
二.动态代理模式:动态代理类的源码是在程序运行期间通过JVM反射等机制动态生成,代理类和委托类的关系是运行时才确定的。
// 接口
public interface IUserDao {
void save();
void find();
}
class UserDao implements IUserDao{
public void save() {
System.out.println("模拟: 保存用户!");
}
public void find() {
System.out.println("查询");
}
}
* 动态代理:
* 代理工厂,给多个目标对象生成代理对象!
*
*/
class ProxyFactory {
// 接收一个目标对象
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
Object proxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 目标对象使用的类加载器
target.getClass().getInterfaces(), // 目标对象实现的所有接口
new InvocationHandler() { // 执行代理对象方法时候触发
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 获取当前执行的方法的方法名
String methodName = method.getName();
// 方法返回值
Object result = ;
if ("find".equals(methodName)) {
// 直接调用目标对象方法
result = method.invoke(target, args);
} else {
System.out.println("开启事务...");
// 执行目标对象方法
result = method.invoke(target, args);
System.out.println("提交事务...");
}
return result;
}
}
);
return proxy;
}
}
public static void main(String[] args) {
//创建目标对象
IUserDao target = new UserDao();
System.out.println("被代理对象:" + target.getClass());
//创建代理对象
IUserDao proxy = (IUserDao) new ProxyFactory.getProxyInstance();
System.out.println("被代理对象:" + proxy.getClass());
proxy.save();//执行被代理类的方法
}
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- Java设计模式——代理模式(静态代理vs动态代理)
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- JAVA 设计模式:静态代理VS动态代理
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- JAVA学习篇--静态代理VS动态代理
- Java 设计模式——静态代理模式和动态代理模式
- java设计模式之静态代理与动态代理
- java 静态代理与动态代理(代理模式)
- JAVA的代理模式(静态代理、JDK动态代理、cglib动态代理)
- 【GOF23设计模式】_代理模式_静态代理_动态代理_开发场景JAVA236-237
- 代理模式(静态代理和动态代理) JAVA
- java,代理模式(静态代理,动态代理)
- java 设计模式 代理 静态和动态
- java设计模式-代理模式(静态代理,动态代理)
- 从java 反射看延迟加载(代理模式)(六)——动态代理与静态代理
- Java设计模式(七) Spring AOP JDK动态代理 VS. cglib
- Java设计模式学习06——静态代理与动态代理