??? 下面是客户端的代码
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 对象。 */
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?