>  기사  >  Java  >  Java 동적 프록시 모드에 대한 자세한 설명

Java 동적 프록시 모드에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-07 13:31:191274검색

이 글은 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;
 }
  
}

2.4.클라이언트 콜

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();
  
 }
}

2. 결과

Java 동적 프록시 모드에 대한 자세한 설명

3 .Mybatis

3.1.MapperProxy 클래스

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;
 }
 
}

3.2.Client

결과

Java 동적 프록시 모드에 대한 자세한 설명위 내용은 JDK 동적 프록시를 사용하는 예제입니다. Java 프로그래밍을 배우는 모든 분들에게 도움이 되길 바랍니다.

Java 동적 프록시 모드에 대한 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.