Android 설계 모드 파악 - (동적) 프록시 모드

프록시 모드는 사실 목표 대상에 대한 다른 접근 방식을 제공하는 것이다. 프록시 대상을 통해 목표 대상을 방문하는 것은 왜 이렇게 번거로운가!!!사실 원래 코드를 수정하지 않기 위해서 에이전트를 통해서도 이 대상에 접근할 수 있고 확장할 수 있다
이런 모드에는 어떤 응용 장면이 있습니까?먼저 생활에 대응하는 장면을 이야기한다. 스타는 일반 상인에게 스타를 찾아 활동을 해야 한다고 통보를 받는다. 먼저 그의 매니저를 찾아야 한다. 그리고 매니저가 자질구레하거나 운영적인 일을 맡아야 한다. 스타는 구체적인 활동과 관련된 일을 하면 된다.여기 매니저의 역할은 대리인으로서

정적 에이전트


우선 정적 에이전트, 코드
 /**
     *  , 
     */
    public interface IStarDao {
        void dowork();
    }

    /**
     *  
     *  
     */
    public class SuperStarDao implements IStarDao {

        @Override
        public void dowork() {
            // 
        }
    }

    /**
     *  
     *  , , 
     */
    public class StarbrokerDaoProxy implements IStarDao {

        private IStarDao starDao;

        public StarbrokerDaoProxy(IStarDao starDao) {
            this.starDao = starDao;
        }

        @Override
        public void dowork() {
            /*-- --*/
            starDao.dowork();// 
            /*-- --*/
        }
    }

OK, 이로써 스타와 매니저는 창설이 끝났고, 그 다음은 어떻게 조작하는가. 먼저 구체적인 스타를 찾은 다음에 대응하는 매니저, 즉 대리류를 찾아 모든 일을 완성한다.
    public void main() {
        SuperStarDao starDao = new SuperStarDao();
        StarbrokerDaoProxy proxy = new StarbrokerDaoProxy(starDao);
        proxy.dowork();
    }

동적 에이전트


동적 에이전트의 특징은 대리 대상을 미리 만들 필요가 없고 반사 메커니즘을 이용하여 운행할 때 대리 유형을 만들어 동적 대리 기능을 실현하는 것이다. 즉, 이곳의 스타들은 구체적인 매니저가 필요하지 않다는 것이다.이벤트가 있을 때 매니저를 만들 수 있습니다. 자신일 수도 있고 가족일 수도 있습니다. 그리고 원래 대리하는 일을 완성할 수 있습니다. 코드를 보십시오.
    public void main() {
        final IStarDao starDao = new SuperStarDao();

        IStarDao proxy = (IStarDao) Proxy.newProxyInstance(
                starDao.getClass().getClassLoader(),
                starDao.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*-- --*/
                        Object returnValue = method.invoke(starDao, args);// 
                        /*-- --*/
                        return returnValue;
                    }
                });

        proxy.dowork();
    }

안드로이드에서의 응용


Retrofit, 다들 잘 아시겠지만retrofit의 핵심 내용은 동적 에이전트를 사용한 것입니다.
retrofit가 어떻게 일을 하는지 생각해 보세요.인터페이스에 설정해야 할 요청 방법을 쓰고 주석을 추가한 다음인터페이스의 실례를 만들면 네트워크 요청을 직접 호출할 수 있습니다.코드 보기:
public interface ApiService {
   	@POST(RetrofitHelper.APP_V1 + "/banner")
    Observable<BaseEntity<List<Banner>>> getBanners();
}
 
ApiService mService = new Retrofit.Builder().baseUrl("").build().create(ApiService.class);

service.getBanners().enqueue(callback);


Api Service 인터페이스와 인터페이스 아래에 있는 getBanners 방법만 썼을 뿐 네트워크 요청을 할 수 있습니다.그래서 Retrofit는 우리가 네트워크 요청을 쓰는 것을 대체하는 구체적인 논리, 즉 에이전트를 완성하는 역할을 한다.
구체적으로 어떻게 대리했어요?비밀은 주로 이create(Api Service.class) 방법에서 원본 코드를 보십시오.
  public <T> T create(final Class<T> service) {
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
              throws Throwable {
            ServiceMethod<Object, Object> serviceMethod =
                (ServiceMethod<Object, Object>) loadServiceMethod(method);
            OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
            return serviceMethod.callAdapter.adapt(okHttpCall);
          }
        });
  }

이 newProxyInstance 메서드 보셨죠? 이것이 바로 동적 프록시 클래스를 만드는 방법입니다.voke 방법에서는 인터페이스 안의 방법의 일부 파라미터를 구체적으로 분해한 다음에 네트워크 요청의 전체 과정을 완성한다. 즉, 대리인이 당신을 도와 하는 일들이다.
여기에 겸사겸사 이 원본 코드들이 무슨 일을 했는지 간단히 말해서 모두가 직접 원본 코드를 연구하는 데도 편리하다
  • loadServiceMethod는 주로 인터페이스에 있는 모든 방법의 주석, 파라미터 등을 읽는다
  • new OkHttpCall은 주로 okhttp를 호출하는 방법으로 네트워크 요청을 한다
  • adapt(okHttpCall)는 주로 OkHttpCall 대상을 전환하고 주 라인
  • 으로 전환한다.
    너의 하나, 바로 내가 나누는 동력❤️.

    좋은 웹페이지 즐겨찾기