繁体   English   中英

Groovy - Java类的反射 - 方法和参数

[英]Groovy - reflection on a Java class - methods and parameters

你将如何在Groovy中进行这个反射任务:

(1)为Groovy函数提供类类型
(2)循环遍历此类的所有方法
(a)从方法中打印出每个参数名称和类型
(b)打印出退货类型

我认为你能做的最好的事情是写下这样的东西:

def dumpOut( clz ) {
  clz.metaClass.methods.each { method ->
    println "${method.returnType.name} ${method.name}( ${method.parameterTypes*.name.join( ', ' )} )"
  }
}

dumpOut String.class 

哪个会打印出来:

boolean equals( java.lang.Object )
java.lang.Class getClass(  )
int hashCode(  )
void notify(  )
void notifyAll(  )
java.lang.String toString(  )
void wait(  )
void wait( long )
void wait( long, int )
char charAt( int )
int codePointAt( int )
int codePointBefore( int )
int codePointCount( int, int )
int compareTo( java.lang.Object )
int compareTo( java.lang.String )
int compareToIgnoreCase( java.lang.String )
java.lang.String concat( java.lang.String )
boolean contains( java.lang.CharSequence )
boolean contentEquals( java.lang.CharSequence )
boolean contentEquals( java.lang.StringBuffer )
java.lang.String copyValueOf( [C )
java.lang.String copyValueOf( [C, int, int )
boolean endsWith( java.lang.String )
boolean equals( java.lang.Object )
boolean equalsIgnoreCase( java.lang.String )
java.lang.String format( java.lang.String, [Ljava.lang.Object; )
java.lang.String format( java.util.Locale, java.lang.String, [Ljava.lang.Object; )
[B getBytes(  )
[B getBytes( java.lang.String )
[B getBytes( java.nio.charset.Charset )
void getBytes( int, int, [B, int )
void getChars( int, int, [C, int )
int hashCode(  )
int indexOf( int )
int indexOf( java.lang.String )
int indexOf( int, int )
int indexOf( java.lang.String, int )
java.lang.String intern(  )
boolean isEmpty(  )
int lastIndexOf( int )
int lastIndexOf( java.lang.String )
int lastIndexOf( int, int )
int lastIndexOf( java.lang.String, int )
int length(  )
boolean matches( java.lang.String )
int offsetByCodePoints( int, int )
boolean regionMatches( int, java.lang.String, int, int )
boolean regionMatches( boolean, int, java.lang.String, int, int )
java.lang.String replace( char, char )
java.lang.String replace( java.lang.CharSequence, java.lang.CharSequence )
java.lang.String replaceAll( java.lang.String, java.lang.String )
java.lang.String replaceFirst( java.lang.String, java.lang.String )
[Ljava.lang.String; split( java.lang.String )
[Ljava.lang.String; split( java.lang.String, int )
boolean startsWith( java.lang.String )
boolean startsWith( java.lang.String, int )
java.lang.CharSequence subSequence( int, int )
java.lang.String substring( int )
java.lang.String substring( int, int )
[C toCharArray(  )
java.lang.String toLowerCase(  )
java.lang.String toLowerCase( java.util.Locale )
java.lang.String toString(  )
java.lang.String toUpperCase(  )
java.lang.String toUpperCase( java.util.Locale )
java.lang.String trim(  )
java.lang.String valueOf( [C )
java.lang.String valueOf( boolean )
java.lang.String valueOf( char )
java.lang.String valueOf( double )
java.lang.String valueOf( float )
java.lang.String valueOf( int )
java.lang.String valueOf( java.lang.Object )
java.lang.String valueOf( long )
java.lang.String valueOf( [C, int, int )

我认为在不操作字节码的情况下参数名称是不可能的(假设该类是使用这种调试信息完整编译的)

也许这更容易,因为问题最初是回答的。

someThing.metaClass.methods.each {println it}

例如:

groovy:000> Object.metaClass.methods.each {println it}
public boolean java.lang.Object.equals(java.lang.Object)
public final native java.lang.Class java.lang.Object.getClass()
public native int java.lang.Object.hashCode()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String java.lang.Object.toString()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
===> [public boolean java.lang.Object.equals(java.lang.Object), public final native java.lang.Class java.lang.Object.getClass(), public native int java.lang.Object.hashCode(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll(), public java.lang.String java.lang.Object.toString(), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM