静态代理和动态代理的例子

1.静态代理
静态代理 时序图:
[img]

[/img]
静态的代理
存在的问题:
1.需要建立大量的代理类
2.重复的代码会出现各个角落里。
接口

package com.test.dao;

public interface UserDao {

public void addUser(String userId,String userName);

public String findById(String id);

public void modifyUser(String userId,String userName);
}


实现类:

package com.test.dao;


public class userDaoImpl implements UserDao {

public void addUser(String userId, String userName) {

System.out.println("userDaoImpl----->addUser()"+userName);

}

public String findById(String id) {
// TODO Auto-generated method stub
return null;
}

public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub

}

}


静态代理类:

package com.test.dao;


public class userDaoImpl implements UserDao {

public void addUser(String userId, String userName) {

System.out.println("userDaoImpl----->addUser()"+userName);

}

public String findById(String id) {
// TODO Auto-generated method stub
return null;
}

public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub

}

}


调用的客户端:

package com.test.dao;

public class Client {

/**
* @param args
*/
public static void main(String[] args) {
UserDao userDao= new UserProxyImpl(new userDaoImpl());

userDao.addUser("a001", "郭靖");

}

}



[size=large]2.动态代理:[/size]
动态代理 时序图:
[img]

[/img]
接口

package com.test.dao;

public interface UserDao {

public void addUser(String userId,String userName);

public String findById(String id);

public void modifyUser(String userId,String userName);
}


实现类:

package com.test.dao;


public class userDaoImpl implements UserDao {

public void addUser(String userId, String userName) {

System.out.println("userDaoImpl----->addUser()"+userName);

}

public String findById(String id) {
// TODO Auto-generated method stub
return null;
}

public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub

}

}


代理类:

package com.test.dao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogHendler implements InvocationHandler {

//声明目标对象 所有类用继承之Object
private Object targetObject;
//根据转入的对象创建代理类
public Object newProxyObject(Object targetObject){
this.targetObject=targetObject;
//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader()
, targetObject.getClass().getInterfaces()
, this);
}
/**
* proxy - 在其上调用方法的代理实例
* method - 对应于在代理实例上调用的接口方法的 Method 实例
* args - 包含传入代理实例上方法调用的参数值的对象数组
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理start()------>"+method.getName());
//取方法参数个数
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
//用作返回
Object ret=null;
try{
//调用对象方法,如果有返回则存入ret中返回结果
ret=method.invoke(this.targetObject, args);
System.out.println("代理success------>"+method.getName());
}catch(Exception e){
e.printStackTrace();
System.out.println("调用代理------>失败!");
}
return ret;
}

}



调用的客户端:

package com.test.dao;

public class Client {

/**
* @param args
*/
public static void main(String[] args) {
// UserDao userDao= new UserProxyImpl(new UserDaoImpl());
//
// userDao.addUser("a001", "郭靖");

LogHendler hendler =new LogHendler();
//根据真实的类生成代理对象
UserDao userDao=(UserDao)hendler.newProxyObject(new UserDaoImpl());
userDao.addUser("aoo1", "郭靖");
}

}



3.项目应用动态代理做事务处理

public class TransactionHandler implements InvocationHandler {
//取得目标对象
private Object targetObject;
public Object newProxyObject(Object targetObject){
this.targetObject=targetObject;
//根据传入的对象产生目标对象
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader()
, targetObject.getClass().getInterfaces()
, this);
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object ret=null;
Connection conn=null;
try{
conn=ConnectionManager.getConnection();
//只对add,modify,del开头的方法,开启事务,对find开头方法不开启事务
if(method.getName().startsWith("add")||
method.getName().startsWith("modify")||
method.getName().startsWith("del")){
//开启事务
ConnectionManager.setAutoCommit(conn, false);
}
//调用目标方法,返回结果
ret=method.invoke(targetObject, args);
//如果是自动提交,则不要再重复提交
if(!conn.getAutoCommit()){
//提交事务
ConnectionManager.commit(conn);
}
}catch(AppException e ){
//事务回滚
ConnectionManager.rollback(conn);
throw e;
}finally{
ConnectionManager.closeConnection();
}
return ret;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java静态代理是一种设计模式,它允许我们通过创建一个代理类来控制对目标对象的访问。代理类和目标类实现相同的接口,代理类中持有目标对象的引用,并在调用目标对象的方法之前或之后执行一些额外的操作。 下面是一个简单的Java静态代理例子: ```java // 定义一个接口 interface Image { void display(); } // 目标类 class RealImage implements Image { private String filename; public RealImage(String filename) { this.filename = filename; loadFromDisk(); } private void loadFromDisk() { System.out.println("Loading image: " + filename); } public void display() { System.out.println("Displaying image: " + filename); } } // 代理类 class ImageProxy implements Image { private RealImage realImage; private String filename; public ImageProxy(String filename) { this.filename = filename; } public void display() { if (realImage == null) { realImage = new RealImage(filename); } realImage.display(); } } // 使用代理类 public class Main { public static void main(String[] args) { Image image = new ImageProxy("image.jpg"); image.display(); } } ``` 在上面的例子中,`RealImage`是目标类,它实现了`Image`接口。`ImageProxy`是代理类,它也实现了`Image`接口,并在`display`方法中调用了目标对象的`display`方法。在`ImageProxy`中,如果目标对象还没有被创建,它会在第一次调用`display`方法时创建一个目标对象。 这样,通过静态代理,我们可以在不修改目标类的情况下,对目标类的方法进行扩展或增强,例如在代理类中添加日志记录、权限控制等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值