最近Retrofitというライブラリを教えてもらったのでこれを使って遊んでました。

interface Hoge {
  @GET("/users")
  List<User> findUsers();
}
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("...")
    .build();
Hoge hoge = retrofit.create(Hoge.class);
List<User> users = hoge.findUsers();

Hogeインターフェイスを作っておいて、RetrofitにHoge.classを渡してインスタンスを返してもらうと、findUsersが/usersにGETで情報を取得してくるメソッドとして振る舞ってくれるといった動きをします。

どういった実装になっているかRetrofitのコードを読んでみましょう。
Retrofitのリポジトリ: https://github.com/square/retrofit

Retrofit#createを見てみます。

  public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
      eagerlyValidateMethods(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, Object... args)
              throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            if (platform.isDefaultMethod(method)) {
              return platform.invokeDefaultMethod(method, service, proxy, args);
            }
            return loadMethodHandler(method).invoke(args);
          }
        });
  }

どうやらProxy#newProxyInstanceでインスタンスを作っているみたいです。
Proxy#newProxyInstanceは第二引数のClass[]を実装するプロキシインスタンスを作るメソッドです。第三引数のInvocationHandlerはプロキシインスタンスのメソッドが呼び出されるとinvokeメソッドが呼び出されるので、プロキシインスタンスの振る舞いはこのInvocationHandlerに書きます。
Retrofit#createは引数のインターフェイスを実装したプロキシインスタンスを返して、振る舞いはInvocationHandler#invoke内でやってるって感じみたいですね。
ここまで分かれば後は色々と遊べそうです。

というわけで講義中に遊びで作ったProxyを使ったコードをのせておしまいです。