basyura's blog

あしたになったらほんきだす。

クラス名からメソッド一覧を取得する

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

neocomplcache のプラグインの作り方を見ていて、java でもっと楽に補完できないかなぁと思案(楽にできるならとっくに誰かがやってるのは置いておく)。

vimproc を使ってソケット通信してみる。例えば「java.util.ArrayList」を渡すと、そのインスタンスメソッドの一覧を返すようにしたい。

try
  let s:socket = vimproc#socket_open('localhost', 20000)
  call s:socket.write("java.util.ArrayList\n")
  let s:methods = s:socket.read_line()
  call s:socket.close()

  for s:val in split(s:methods , ",")
    echo s:val
  endfor

catch
  echo v:exception
endtry

jruby のサーバを立てる

java だったら jruby 使ったら楽じゃね?(クラス名から Class を取得する方法がよく分からなかった)

include Java

require 'socket'

server = TCPServer.open(20000)

while true
  socket = server.accept
  m = (eval socket.gets).instance_methods.join(",")
  puts m

  socket.send "#{m}\n" , 0 
  socket.close
end

server.close

結果

RangeCheck
ensureCapacity
clone
read_object
subList
fast_remove
fastRemove
write_object
trim_to_size
iterator
retainAll
removeAll
contains_all
list_iterator
retain_all
remove_all
・
・
・

ruby のメソッドが混ざるのであまりよろしくない

java でサーバを立てる

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.lang.reflect.Method;
import java.util.List;
import java.util.ArrayList;

public class Server {

  public static void main(String[] args) throws Exception {

    ServerSocket servSock = new ServerSocket(20000);

    while (true) {

      Socket socket = servSock.accept();

      InputStream       is     = socket.getInputStream();
      InputStreamReader reader = new InputStreamReader(is);
      BufferedReader    br     = new BufferedReader(reader);

      String line = br.readLine();

      Class clazz = Class.forName(line);
      Method[] methods = clazz.getMethods();
      List list = new ArrayList();
      for (Method m : methods) {
        String name = m.getName();
        if (!list.contains(name)) {
          list.add(name);
        }
      }
      StringBuilder sb = new StringBuilder();
      for (int i = 0 ; i < list.size() ; i++) {
        if (i != 0) {
          sb.append(",");
        }
        sb.append(list.get(i));
      }

      System.out.println(sb.toString());

      DataOutputStream out = new DataOutputStream(socket.getOutputStream());
      out.writeBytes(sb.toString() + "\n");

      br.close();
      reader.close();
      is.close();
      out.close();
      socket.close();
    }
  }
}

結果

add
get
clone
indexOf
clear
isEmpty
lastIndexOf
contains
addAll
size
toArray
remove
set
ensureCapacity
trimToSize
equals
hashCode
iterator
・
・
・

なげえ・・・。けど、欲しいものは取れた。

じゃあ、補完するの簡単じゃね?

なわけない。文脈を読むのが糞めんどくさい・・・。
レスポンスは問題なさそうなんだけどなぁ。