1)创建接口
public interface IUserDao {
void add();
void delete();
void find();
void update();
}
2)实现接口1
public class UserDaoImpl implements IUserDao{
@Override
public void add() {
System.out.println(“添加用户”);
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void find() {
System.out.println("查询用户");
}
@Override
public void update() {
System.out.println("更新用户");
}
}
3)实现接口2
package com.myh.jdk_dynamic_proxy;
public class UserDaoImpl2 implements IUserDao{
@Override
public void add() {
//在加入一些监控行为
System.out.println(“权限校验”);
System.out.println("添加用户");
System.out.println("日志记录");
}
@Override
public void delete() {
//在加入一些监控行为
System.out.println("权限校验");
System.out.println("添加用户");
System.out.println("日志记录");
}
@Override
public void find() {
//在加入一些监控行为
System.out.println("权限校验");
System.out.println("添加用户");
System.out.println("日志记录");
}
@Override
public void update() {
//在加入一些监控行为
System.out.println("权限校验");
System.out.println("添加用户");
System.out.println("日志记录");
}
}
4)创建JdkProxy类完成动态代理
import java.lang.reflect.Proxy;
/**
* 代理:描述:让代理类帮助真实角色完成一些事情
* 静态:代理和被代理类都需要实现同一个接口(线程中的Runnable接口)
* 动态代理:在程序的执行过程中,通过反射的方式获取代理对象
* jdk动态代理:基于接口来完成 必须存在一个接口
* cglib动态代理:基于子类来完成
*
* java.lang.reflect.Proxy提供用于创建动态代理类和实例的静态方法
* public static Object newProxyInstance(
* ClassLoader loader,//第一个参数,定义代理类的类加载器,类对象.getClass().getClassLoader();
* Class<?>[] interfaces,//第二个参数,代理类要实现的接口列表, 类对象.getClass().getInterfaces();
* InvocationHandler h //第三个参数,指派方法调用的调用处理程序,要创建InvocationHandler接口的实现类,自定义一个类来实现InvocationHandler,或者InvocationHandler接口的匿名内部类,重写方法,完成功能的增强,(接口:代理实例的调用处理程序 实现的接口 Object invoke(
* Object proxy,//在其上调用方法的代理实例
* Method method,//调用的接口方法的Method实例(需要被增强的业务方法)
* Object[] args //方法调用的参数值:就是当前业务方法中的参数(参数数组)
* )throws Throwable; //完成对userDao的业务功能的增强
* )
* )throws IllegalArgumentException
*/
public class JdkProxy {
public static void main(String[] args) {
//创建IUserDao类对象
//接口多态实现
IUserDao userDao = new UserDaoImpl();
userDao.add();
userDao.delete();
userDao.find();
userDao.update();
System.out.println("===================");
//版本2:针对上面的代码进行增强
IUserDao userDao2 = new UserDaoImpl2();
userDao2.add();
userDao2.delete();
userDao2.find();
userDao2.update();
System.out.println("没有使用动态代理完成==========================");
MyInvocationHanler handler = new MyInvocationHanler(userDao);//针对userDao对象,产生代理实例
//使用jdk动态代理完成
IUserDao userDao3 = (IUserDao) Proxy.newProxyInstance(
//代理类的类加载器
userDao.getClass().getClassLoader(),
//代理类要实现的接口列表的IUserDao public Class<?>[] getInterfaces()
userDao.getClass().getInterfaces(),
//指派方法调用的调用处理程序
handler
);
userDao3.add();
userDao3.delete();
userDao3.update();
userDao3.find();
System.out.println("开始使用动态代理完成");
}
}
5)创建InvocationHandler的实现类
import org.omg.CORBA.SystemException;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.InvokeHandler;
import org.omg.CORBA.portable.OutputStream;
import org.omg.CORBA.portable.ResponseHandler;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 指派的代理程序
*/
public class MyInvocationHandler implements InvocationHandler {
private Object target;//目标对象 userDao(针对谁来产生代理对象)
public MyInvocationHandler(Object target) {
this.target = target;
}
/* @Override
public OutputStream _invoke(Object proxy,String method, InputStream input, ResponseHandler handler) throws SystemException {
}*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限校验1");//method:针对业务方法调用
Object obj = method.invoke(target, args);//add,delte,update,find
System.out.println("日志记录检查");
return obj;//返回技术代理实例
}
}