使用Java反射可以在运行时获取一个类的各种信息,包括类的属性、方法、构造器等。本文将介绍如何通过反射获取一个对象的方法信息,并提供两个示例进行说明。
获取对象的方法信息
要获取一个对象的方法信息,需要使用Java反射中的Method类。Method类提供了关于类或接口中单独某个方法的信息和访问权限。
使用反射获取对象的方法信息的步骤如下:
- 获取该类的Class对象。
java
Class<?> clazz = obj.getClass();
这里的obj是一个Object类型的对象,可以是任何一个Java对象。getClass()方法返回表示该对象所属类或接口的Class对象。
- 通过Class类的getDeclaredMethods()或getMethods()方法获取该类的全部或公共方法。
java
Method[] methods = clazz.getDeclaredMethods();
//或者
Method[] methods = clazz.getMethods();
getDeclaredMethods()方法返回该类中声明的全部方法,包括私有方法。getMethods()方法返回该类或其父类中的全部公共方法。这两个方法都返回一个Method数组。
- 遍历Method数组获取方法的信息。
java
for (Method method : methods) {
//获取该方法的访问修饰符
int modifiers = method.getModifiers();
String modifierStr = Modifier.toString(modifiers);
//获取方法名
String methodName = method.getName();
//获取方法的参数数量
int parameters = method.getParameterCount();
//获取方法的返回值类型
Class<?> returnType = method.getReturnType();
//输出方法信息
System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
}
通过Method类提供的方法可以获取方法的访问修饰符、方法名、参数数量和返回值类型等信息。
示例
下面提供两个示例进行说明。
示例1
以String类为例,获取该类的全部方法信息。
public static void main(String[] args) {
String str = "Hello, world!";
Class<?> clazz = str.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
int modifiers = method.getModifiers();
String modifierStr = Modifier.toString(modifiers);
String methodName = method.getName();
int parameters = method.getParameterCount();
Class<?> returnType = method.getReturnType();
System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
}
}
输出结果:
public int length()
public int codePointCount(int,int)
public int codePointAt(int)
public int codePointBefore(int)
public int offsetByCodePoints(int,int)
public void getChars(int,int,char[],int)
public byte[] getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public byte[] getBytes()
public boolean contentEquals(java.lang.CharSequence)
public boolean contentEquals(java.lang.StringBuffer)
public boolean equalsIgnoreCase(java.lang.String)
public int compareTo(java.lang.Object)
public int compareTo(java.lang.String)
public int compareToIgnoreCase(java.lang.String)
public boolean regionMatches(int,java.lang.String,int,int)
public boolean regionMatches(boolean,int,java.lang.String,int,int)
public boolean startsWith(java.lang.String,int)
public boolean startsWith(java.lang.String)
public boolean endsWith(java.lang.String)
public int hashCode()
public int indexOf(int)
public int indexOf(int,int)
public int lastIndexOf(int)
public int lastIndexOf(int,int)
public int indexOf(java.lang.String)
public int indexOf(java.lang.String,int)
public int lastIndexOf(java.lang.String)
public int lastIndexOf(java.lang.String,int)
public java.lang.String substring(int)
public java.lang.String substring(int,int)
public java.lang.String concat(java.lang.String)
public java.lang.String replace(char,char)
public java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)
public boolean matches(java.lang.String)
public boolean contains(java.lang.CharSequence)
public java.lang.String[] split(java.lang.String,int)
public java.lang.String[] split(java.lang.String)
public static java.lang.String join(java.lang.CharSequence,java.lang.CharSequence[])
public static java.lang.String join(java.lang.CharSequence,java.lang.Iterable)
public java.lang.String toLowerCase()
public java.lang.String toLowerCase(java.util.Locale)
public java.lang.String toUpperCase()
public java.lang.String toUpperCase(java.util.Locale)
public java.lang.String trim()
public char[] toCharArray()
public static java.lang.String format(java.lang.String,java.lang.Object[])
public static java.lang.String format(java.util.Locale,java.lang.String,java.lang.Object[])
public static java.lang.String valueOf(java.lang.Object)
public static java.lang.String valueOf(char[])
public static java.lang.String valueOf(char[],int,int)
public static java.lang.String valueOf(boolean)
public static java.lang.String valueOf(char)
public static java.lang.String valueOf(int)
public static java.lang.String valueOf(long)
public static java.lang.String valueOf(float)
public static java.lang.String valueOf(double)
public native java.lang.String toString()
示例2
自定义一个Person类,获取该类的公共方法信息。
public class Person {
private String name;
public Person() {}
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("Hello, my name is " + name);
}
public void sayGoodbye() {
System.out.println("Goodbye, " + name);
}
}
public static void main(String[] args) {
Person person = new Person("John");
Class<?> clazz = person.getClass();
Method[] methods = clazz.getMethods();
for (Method method : methods) {
int modifiers = method.getModifiers();
String modifierStr = Modifier.toString(modifiers);
String methodName = method.getName();
int parameters = method.getParameterCount();
Class<?> returnType = method.getReturnType();
System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
}
}
输出结果:
public void sayHello()
public void sayGoodbye()
public final void wait(long) throws java.lang.InterruptedException
public final native void wait(long,int) throws java.lang.InterruptedException
public final void wait() throws java.lang.InterruptedException
public boolean equals(java.lang.Object)
public java.lang.String toString()
public native int hashCode()
public final native java.lang.Class getClass()
public final native void notify()
public final native void notifyAll()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射之通过反射获取一个对象的方法信息(实例代码) - Python技术站