静态代理代码实例
下面是业务接口:
// 业务接口
public interface IUserDao {
// 新增数据
void save();
}
下面是目标对象的实现类:
// 实现接口
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("保存数据...");
}
}
下面是代理对象的实现类:
// 静态代理类
public class UserDaoProxy implements IUserDao{
// 接收目标对象
private IUserDao target;
public UserDaoProxy(IUserDao target) {
this.target = target;
}
// 代理方法
@Override
public void save() {
// 调用目标方法前的处理
System.out.println("开始代理....");
// 调用目标方法
target.save();
// 调用目标方法后的处理
System.out.println("结束代理...");
}
}
下面是测试类:
public class TestProxy {
public static void main(String[] args) {
// 目标对象
IUserDao target = new UserDao();
// 创建代理对象,把目标对象传递给代理对象,建立代理关系
IUserDao proxy = new UserDaoProxy(target);
// 执行代理操作的方法
proxy.save();
}
}
动态代理代码实例
下面是业务接口:
// 业务接口
public interface IUserDao {
void save();
int update(int id);
}
下面是业务接口实现类目标类:
// 被代理对象
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("保存数据...");
}
@Override
public int update(int id) {
return id;
}
}
下面是invocationhandler实现类,写具体逻辑:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
// 创建Invocation接口的实现类,在invoke方法中实现代理逻辑
public class MyInvocationHandler implements InvocationHandler{
// 被代理对象(目标对象)
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
// 实现具体的代理逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始执行..." + method.getName() + "方法");
// 执行目标对象的相关方法save()
Object returnObj = method.invoke(target, args);
System.out.println("结束执行..." + method.getName() + "方法");
return returnObj;
}
}
下面是获取代理对象的类,使用newProxyInstance()方法:
import java.lang.reflect.Proxy;
// 生产代理对象的工厂
public class ProxyFactory {
/**
* 方法描述:获取代理对象
* @param target 目标对象
* @return 代理对象
*/
public static Object getProxy(Object target) {
// 创建一个InvocationHandler实现类的对象,会触发事件处理器的方法,会吧当前执行目标对象作为形参传入
MyInvocationHandler handler = new MyInvocationHandler(target);
// 通过Proxy中的静态方法newProxyInstance创建代理对象
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), handler);
// 返回代理对象
return proxy;
//jdk8的处理方式 Lambda表达式
/*return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
(proxy,method,args)->{
System.out.println("开始执行..." + method.getName() + "方法");
// 执行目标对象的相关方法save()
Object returnObj = method.invoke(target, args);
System.out.println("结束执行..." + method.getName() + "方法");
return returnObj;
});*/
}
}
下面是动态代理的测试类:
public class TestProxy {
public static void main(String[] args) {
// 目标对象
IUserDao target = new UserDao();
System.out.println(target.getClass());
// 根据目标对象生成代理对象
IUserDao proxy = (IUserDao)ProxyFactory.getProxy(target);
System.out.println(proxy.getClass());
// 使用代理对象执行方法调用
proxy.save();
int result = proxy.update(1);
System.out.println(result);
}
}