이 글은 Java 동적 프록시에 대한 지식 포인트를 정리한 것입니다.
1. JAVA 동적 프록시(자세한 공식 설명)
프록시 모드는 일반적으로 사용되는 Java 디자인 패턴이며, 그 특징은 프록시입니다. 클래스는 대리자 클래스와 동일한 인터페이스를 가지고 있습니다. 프록시 클래스는 주로 대리자 클래스에 대한 메시지 전처리, 메시지 필터링, 대리자 클래스에 메시지 전달 및 이후 메시지 처리를 담당합니다. 일반적으로 프록시 클래스와 대리자 클래스 사이에는 연결이 있습니다. 프록시 클래스의 개체는 대리자 클래스의 개체와 실제로 연결되지 않지만 관련 메서드를 호출합니다. 대리자 클래스의 객체에 대한 특정 서비스를 제공합니다.
에이전트 생성 기간에 따라 에이전트 클래스는 두 가지 유형으로 나눌 수 있습니다.
정적 프록시: 프로그래머가 생성하거나 특정 도구를 사용하여 자동으로 생성한 후 컴파일합니다. 프로그램이 실행되기 전에 프록시 클래스의 .class 파일이 이미 존재합니다.
동적 프록시: 프로그램이 실행될 때 반사 메커니즘을 사용하여 동적으로 생성됩니다.
2. 동적 프록시 구현
java.lang.reflect.Proxy,
Proxy는 동적 프록시 클래스 및 인스턴스를 생성하기 위한 정적 메서드를 제공합니다.
newProxyInstance()
반환 지정된 호출 처리기에 메서드 호출을 할당할 수 있는 지정된 인터페이스의 프록시 클래스 인스턴스입니다.
2.1.Dao 인터페이스(시뮬레이션된 데이터 접근 계층 인터페이스 제공)
package javaproxy; /* * 定义一个数据访问层接口 */ public interface Dao { //模拟数据保存 public void save(); }
2.2.DaoImpl 클래스 구현 클래스
package javaproxy; public class DaoImpl implements Dao{ @Override public void save() { System.out.println("执行一个保存方法。。。。。。。。。。。。"); } }
2.3. 🎜>
package javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DaoHandler implements InvocationHandler{ private Object obj; public DaoHandler(Object obj) { this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("do something before method");//这里模拟AOP的前置方法 Object ret = method.invoke(this.obj, args); System.out.println("do something after method");//这里模拟AOP的后置方法 return ret; } }
package javaproxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { // 元对象(被代理对象) DaoImpl daoImpl = new DaoImpl(); // 业务代理类 DaoHandler daoHandler=new DaoHandler(daoImpl); Dao dao=(Dao) Proxy.newProxyInstance(daoImpl .getClass().getClassLoader(), daoImpl.getClass() .getInterfaces(), daoHandler); dao.save(); } }
package javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MapperProxy implements InvocationHandler { @SuppressWarnings("unchecked") /* * 这里通过静态方法得到实现类的对象 * * @param:接口 * * @param:用sqlsession执行方法 * * @return: 返回代理对像 */ public static <T> T newMapperProxy(Class<T> mapperInterface, Object sqlSession) { ClassLoader classLoader = mapperInterface.getClassLoader(); Class<?>[] interfaces = new Class[] { mapperInterface }; MapperProxy proxy = new MapperProxy(); return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); } /* * (non-Javadoc) * * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object[]) * * @param:代理对象 * * @param:方法通过方法名字找到对应的方法 * * @param:通过方法传入对象找到对应的传递参数映射 * * @return:返回执行后的参数对象 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 这里通过方法名字以及参数通过解析对应的mapper来执行对应的操作 System.out.println("在这里执行实际方法"); return null; } }
결과
위 내용은 JDK 동적 프록시를 사용하는 예제입니다. Java 프로그래밍을 배우는 모든 분들에게 도움이 되길 바랍니다.
Java 동적 프록시 모드에 대한 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!