1. 프록시 패턴
프록시 패턴은 다른 객체에 대한 프록시를 제공하여 이 객체에 대한 액세스를 제어하는 것입니다. 실제로 프록시 모드는 객체에 액세스할 때 어느 정도의 간접 참조를 도입합니다. 이 간접 참조는 다양한 목적으로 연결될 수 있습니다.
프록시 클래스와 델리게이트 클래스의 인터페이스가 동일한 것이 특징입니다. 프록시 클래스는 주로 델리게이트 클래스에 대한 메시지 전처리, 메시지 필터링, 델리게이트 클래스에 메시지 전달, 이후 메시지 처리를 담당합니다. 일반적으로 프록시 클래스와 대리자 클래스 사이에는 연결이 있습니다. 프록시 클래스의 개체는 대리자 클래스의 개체와 실제로 연결되지 않지만 관련 메서드를 호출합니다. 대리자 클래스의 객체에 대한 특정 서비스를 제공합니다.
2. 분류
에이전트 클래스는 생성시기에 따라 정적 프록시 클래스와 동적 프록시 클래스 두 가지로 나눌 수 있습니다.
정적 프록시 클래스: 프로그래머가 생성하거나 특정 도구를 사용하여 자동으로 생성한 후 컴파일합니다. 프로그램이 실행되기 전에 프록시 클래스의 .class 파일이 이미 존재합니다.
동적 프록시 클래스: 프로그램이 실행될 때 반사 메커니즘을 사용하여 동적으로 생성됩니다.
3. 정적 프록시 및 동적 프록시의 예
정적 프록시:
비즈니스 인터페이스 클래스:
package com.bjpowernode.pattern; public interface UserManager { public void addUser(String userId, String userName); public void delUser(String userId); public void modifyUser(String userId, String userName); public String findUser(String userId); }
비즈니스 인터페이스 구현 클래스:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public void addUser(String userId, String userName) { //System.out.println("start-->>addUser() userId-->>" + userId); try { System.out.println("UserManagerImpl.addUser() userId-->>" + userId); //System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); //System.out.println("error-->>addUser()"); throw new RuntimeException(); } } public void delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>" + userId); } public String findUser(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } public void modifyUser(String userId, String userName) { System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId); } }
비즈니스 프록시 클래스:
package com.bjpowernode.pattern; public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager) { this.userManager = userManager; } public void addUser(String userId, String userName) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.addUser(userId, userName); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } public void delUser(String userId) { } public String findUser(String userId) { return null; } public void modifyUser(String userId, String userName) { } }
클라이언트 클래스:
package com.bjpowernode.pattern; public class Client { /** * @param args */ public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); UserManager userManager = new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); } }
실행 결과 :
start-->>addUser() userId-->>0001 UserManagerImpl.addUser() userId-->>0001 success-->>addUser()
동적 프록시:
비즈니스 인터페이스 클래스:
package com.bjpowernode.pattern; public interface UserManager { public String test(String userId); }
비즈니스 인터페이스 구현 클래스:
package com.bjpowernode.pattern; public class UserManagerImpl implements UserManager { public String test(String userId) { System.out.println("UserManagerImpl.findUser() userId-->>" + userId); return "张三"; } }
BusinessHandler 클래스:
package com.bjpowernode.pattern; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BusinessHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start-->>" + method.getName()); for (int i=0; i<args.length; i++) { System.out.println(args[i]); } Object ret = null; try { //调用目标方法 ret = method.invoke(targetObject, args); System.out.println("success-->>" + method.getName()); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>" + method.getName()); throw e; } return ret; } }
클라이언트 클래스:
package com.bjpowernode.pattern; import java.lang.reflect.Field; public class Client { /** * @param args */ public static void main(String[] args) { BusinessHandler businessHandler = new BusinessHandler(); UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl()); //userManager.addUser("0001", "张三"); //userManager.delUser("0001"); // System.out.println(userManager.getClass().getName()); String name = userManager.test("0001"); //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001"); System.out.println("Client.main() --- " + name); } }
실행 결과:
start-->>test 0001 UserManagerImpl.findUser() userId-->>0001 success-->>test Client.main() --- 张三
위 내용은 Java 반사 메커니즘의 동적 프록시 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!