Как работать с ожидаемым типом возврата java.lang.Class?

Я решил попробовать написать интерфейс R для Scribe (зрелая библиотека OAuth для Java от Pablo Fernandez) как способ освежиться в Java (не использовал его 8 лет), изучить rJava и лучше использовать Twitter API. Но в основном потому, что сегодня пятница, и я подумал, что будет весело. :)

К сожалению, я не очень далеко...

Я скачал файл .jar для scribe, а также commons-condec (его единственная зависимость , который я впоследствии разархивировал). Я запустил код на Java с помощью netbeans, и он отлично работает с его пример твиттера.

Я был в порядке для первых нескольких строк кода, просто следуя документации rJava:

# load R packages
library(rJava)

# Initialise
.jinit()

# Add class paths
d1 <- "C:/Users/Tony/Documents/R/java/scribe-1.1.0.jar"
d2 <- "C:/Users/Tony/Documents/R/java/commons-codec-1.4/"
.jaddClassPath(path=c(d1, d2))

Но затем в кратком руководстве по началу работы говорится, что необходимо следующее:

// Java Code
OAuthService service = new ServiceBuilder()
                                .provider(TwitterApi.class)
                                .apiKey("6icbcAXyZx67r8uTAUM5Qw")
                                .apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
                                .build();

Я не могу понять, как переписать это на языке rJava. Небольшой поиск в Интернете подсказывает, что я должен делать это по частям, поэтому сначала я сделал:

# Create object (back to R code again)
( service <- .jnew("org.scribe.builder.ServiceBuilder") )
[1] "Java-Object{org.scribe.builder.ServiceBuilder@58fe64b9}"

# Set up apiKey and apiSecret using "$" shortcut
service$apiKey("6icbcAXyZx67r8uTAUM5Qw")
service$apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")

До сих пор хорошо. Затем мне нужно выяснить, какой тип возврата ожидается от функции провайдера:

# Inspect return type
.jmethods(service, "provider")
[1] "public org.scribe.builder.ServiceBuilder org.scribe.builder.ServiceBuilder.provider(java.lang.Class)"

Ему нужен "java.lang.Class". Вот тут я запутался. Что это значит? Думаю, глядя на source, ему нужен возвращаемый тип типа "ServiceBuilder", но как это сделать? Это было мое лучшее предположение после просмотра ?.jcall (примечание: 'use.true.class = TRUE' ничего не делало):

> .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", method = "org.scribe.builder.ServiceBuilder.provider", "org.scribe.builder.api.TwitterApi")

Error in .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;",  : 
  method org.scribe.builder.ServiceBuilder.provider with signature (Ljava/lang/String;)Lorg.scribe.builder.ServiceBuilder; not found

Любые идеи?


person Tony Breyal    schedule 04.03.2011    source источник


Ответы (1)


Мне кажется, что метод провайдера возвращает ServiceBuilder и принимает класс в качестве параметра.

В Java, если вы поместите имя класса, за которым следует .class, это сделает литеральный объект класса в коде. Если вы вместо этого загружаете класс с помощью отражения, вы можете ссылаться на класс по его строковому имени. Я не уверен, как это работает в R, но в Java синтаксис такой:

Class c = Class.forName("org.scribe.builder.api.TwitterApi");

Это помещает экземпляр класса в переменную c. Затем вы можете вызвать метод провайдера:

service$provider(c);
person Mr. Shiny and New 安宇    schedule 07.03.2011
comment
Для меня это звучит как правильное действие, ура, приятель, но я просто не могу понять, как поместить его в rJava. - person Tony Breyal; 08.03.2011
comment
Что делает этот синтаксис Java, так это вызывает статический метод forName в классе java.lang.Class. Я не знаю rJava или R, но вы можете сделать c ‹- J(java.lang.Class)$forName(org.scribe.builder.api.TwitterApi) - person Mr. Shiny and New 安宇; 08.03.2011