Java基础之动态代理

动态代理:

         在程序运行过程中产生的这个对象;

        运行特点:在程序的执行过程中,通过一个类Proxy和接口invacationHandler(处理程序)实现动态代理;

        Proxy类中的方法创建动态代理类对象:
                public static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
        InvocationHandler接口:
                Object invoke(Object proxy,Method method,Object[] args);

                        参数1:loader类加载器 public ClassLoader getClassLoader():返回该类的类加载器;

                        参数2:public Class[] getInterfaces():如果此对象表示一个类,则返回一个数组,它包含了该类所实现的所有接口的对象;

        举例:
                提供一个针对用户操作的接口:

package org.westos_test3;
/**
 *
 * 针对用户操作的接口
 * 		提供了增删改查的方法
 *
 */
public interface UserDao {

	public abstract void add() ;//增加
	public abstract void delete() ;//删除
	public abstract void update() ;//修改
	public abstract void find() ;//查询
}
                实现UserDao接口:
package org.westos_test3;

//ssh 老框架
public class UserDaoImpl implements UserDao {

	@Override
	public void add() {
		System.out.println("调用了增加功能");
	}

	@Override
	public void delete() {
		System.out.println("调用了删除功能");
	}

	@Override
	public void update() {
		System.out.println("调用了修改功能");
	}

	@Override
	public void find() {
		System.out.println("调用了查询功能");
	}

}
                代理的类:
package org.westos_test3;

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

public class MyInvocationHandler implements InvocationHandler {

	//给哪个对象生成代理  (目标对象)
	private Object target ;
	
	public MyInvocationHandler(Object target) {
		this.target = target ;
	}
	
	@Override
	//proxy:在其上调用方法的代理实例;
	//method:当前底层实现的方法;
	//args:参数,传入的是对象的数组;
	//返回值类型为:Object;
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//实现代理的程序
		System.out.println("权限校验");
		Object obj = method.invoke(target, args) ;//给target进行代理;
		System.out.println("日志记录");
		return obj;//返回的就是代理对象
	}

}
                测试类:
package org.westos_test3;

import java.lang.reflect.Proxy;

/**
 * 动态代理的测试类;
 * 
 */
public class Test {

	public static void main(String[] args) {

		// 创建UserDao对象
		UserDao ud = new UserDaoImpl();
		ud.add();
		ud.delete();
		ud.update();
		ud.find();

		System.out.println("------------------");

		// 针对UserDao对象ud给它生产一个代理对象
		// 调用处理程序,接口实现类中产生代理
		MyInvocationHandler handler = new MyInvocationHandler(ud);

		UserDao ud2 = (UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),ud.getClass().getInterfaces(),handler);
		ud2.add();
		ud2.delete();
		ud2.update();
		ud2.find();
	}
}


猜你喜欢

转载自blog.csdn.net/Future_LL/article/details/80597538
今日推荐