动态代理

    下面是客户端的代码

package com.als.dynamicProxy;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		SecurityHandler handler = new SecurityHandler();
		UserManager userManger = (UserManager) handler
				.createProxyInstance(new UserManagerImpl());
		
		userManger.addUser("liushaoke", "123456") ;
		
		userManger.deleteUser(2) ;
		
	}

}

 

下面定义了一个处理用户业务的接口

package com.als.dynamicProxy;

public interface UserManager {

	/**
	 * 添加用户
	 * @param userName 用户名称
	 * @param password 用户密码
	 */
	public void addUser(String userName, String password) ;
	
	/**
	 * 删除用户
	 * @param uid 用户id
	 */
	public void deleteUser(int uid) ;
	
	/**
	 * 修改用户
	 * @param uid 用户id
	 * @param userName 用户名
	 * @param password 用户密码
	 */
	public void modifyUser(int uid, String userName, String password) ;
	
	/**
	 * 查找用户
	 * @param id 用户id
	 * @return
	 */
	public String findUserById(int id) ;
	
	
}

 

下面是一个用户业务的实现类

package com.als.dynamicProxy;

/**
 * 用户业务逻辑的实现
 * @author Administrator liushaoke
 *
 */
public class UserManagerImpl implements UserManager {

	@Override
	public void addUser(String userName, String password) {
		// TODO Auto-generated method stub
		System.out.println("---------UserManagerImpl.addUser()--------");
	}

	@Override
	public void deleteUser(int uid) {
		// TODO Auto-generated method stub
		System.out.println("---------UserManagerImpl.deleteUser()--------");
	}

	@Override
	public String findUserById(int id) {
		System.out.println("---------UserManagerImpl.findUserById()--------");
		return "liushaoke";
	}

	@Override
	public void modifyUser(int uid, String userName, String password) {
		// TODO Auto-generated method stub
		System.out.println("---------UserManagerImpl.modifyUser()--------");
	}

}

 

 

  如果当客户想再给用户业务添加多一个横切的服务时,可以再实现一个动态代理来为用户业务添加额外的服务

package com.als.dynamicProxy;

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

/* 
 * 动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。
 * 该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被
 * 代理接口的一个实现类    
 */
public class SecurityHandler implements InvocationHandler {

	private Object targetObject;

	public Object createProxyInstance(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
				targetObject.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		checkSecurity();
		// 调用目标方法
		Object result = method.invoke(targetObject, args);
		return result;
	}

	/**
	 * 检查安全性
	 */
	private void checkSecurity() {
		System.out.println("-------checkSecurity-------");
	}

}

 

 

  

	/**
	 * 
	 * 动态代理类 动态代理类的字节码在程序运行时由 Java
	 * 反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件的可扩展性,因为 Java
	 * 反射机制可以生成任意类型的动态代理类。 Java.lang.reflect 包中的 Proxy 类和 InvocationHander
	 * 接口提供了生成动态代理类的能力。
	 * 
	 * Proxy 类提供了创建动态代理类及其实例的静态方法。
	 * 
	 * ⑴ getProxyClass() 静态方法负责创建动态代理类,它的完整定义如下:
	 * 
	 * public static Class<?> getProxyClass(ClassLoader loader, Class<?>[]
	 * interfaces) throws IllegalArgumentException
	 * 
	 * 参数 loader 指定动态代理类的类加载器,参数 interfaces 指定动态代理类需要实现的所有接口。
	 * 
	 * ⑵ newProxyInstance() 静态方法负责创建动态代理类的实例,它的完整定义如下:
	 * 
	 * public static Object newProxyInstance(ClassLoader loader, Class<?>[]
	 * interfaces, InvocationHandler handler) throws IllegalArgumentException
	 * 
	 * 参数 loader 指定动态代理类的类加载器,参数 interfaces 指定动态代理类需要实现的所有接口,参数 handler
	 * 指定与动态代理类关联的 InvocationHander 对象。
	 */

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(编程,工作)