Java 反射学习《一》 Field详解
Java 反射学习《二》 Constructor详解
Java 反射学习《三》Method详解
根据Class获取类的Method
public class Demo {
public void demoMethod1() {
}
public void demoMethod2() {
}
public static void demoMethod3() {
}
}
public interface DemoInterface {
public static void interfaceMethod1() {
}
public default void interfaceMethod2() {
}
public default void interfaceMethod3() {
}
}
public class Person extends Demo implements DemoInterface {
public void method1(String param1) {
System.out.println("这是Method1 " + param1);
}
public boolean method1(int param1) {
System.out.println("这是Method1");
return true;
}
void method2(String param1, String param2) {
System.out.println("这是Method2");
}
protected void method3(String param1, String param2, String param3) {
System.out.println("这是Method3 " + param1 + " "+ param2 + " " + param3 );
}
private void method4(String param1, String param2, String param3) {
System.out.println("这是Method4");
}
public static void method5(String param1) {
System.out.println("这是Method5");
}
public void method5(int param1) {
System.out.println("这是Method5");
}
@Override
public void demoMethod1() {
super.demoMethod1();
}
@Override
public void interfaceMethod2() {
}
}
-
public Method[] getDeclaredMethods() throws SecurityException 返回使用public,protected,default,private,但不包括无论从类还是接口继承的方法,但是从父类或者接口重写的方法会包含在内。也是在类中实现函数的函数都能得到
Class cls = Person.class; Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { System.out.println("修饰符:" + Modifier.toString(method.getModifiers()) + " 名称:" + method.getName() + "参数个数:" + method.getParameterCount()); } //输出 //修饰符:public 名称:method1参数个数:1 //修饰符:public 名称:method1参数个数:1 //修饰符: 名称:method2参数个数:2 //修饰符:protected 名称:method3参数个数:3 //修饰符:private 名称:method4参数个数:3 //修饰符:public static 名称:method5参数个数:1 //修饰符:public 名称:method5参数个数:1 //修饰符:public 名称:demoMethod1参数个数:0 //修饰符:public 名称:interfaceMethod2参数个数:0
-
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 根据函数名和参数类型,获取Method(能获取到的Method和上面一样)
Class cls = Person.class; Person person = new Person(); try{ Method method = cls.getDeclaredMethod("method3",String.class,String.class,String.class); method.invoke(person,"参数1","参数2","参数3"); }catch (Exception e){ } //这是Method3 参数1 参数2 参数3
-
public Method[] getMethods() throws SecurityException 返回所有public修饰的方法,包括从类和接口继承来的方法,但其中父类中静态方法能被继承,但是接口中的静态方法无法被继承。
Class cls = Person.class; Method[] pubMethods = cls.getMethods(); for (Method method : pubMethods) { System.out.println("修饰符:" + Modifier.toString(method.getModifiers()) + " 名称:" + method.getName() + "参数个数:" + method.getParameterCount()); } //输出 接口中静态方法interfaceMethod1没有输出,但是Demo中demoMethod3输出了 //修饰符:public 名称:method1参数个数:1 //修饰符:public 名称:method1参数个数:1 //修饰符:public static 名称:method5参数个数:1 //修饰符:public 名称:method5参数个数:1 //修饰符:public 名称:demoMethod1参数个数:0 //修饰符:public 名称:interfaceMethod2参数个数:0 //修饰符:public 名称:demoMethod2参数个数:0 //修饰符:public static 名称:demoMethod3参数个数:0 //修饰符:public final native 名称:wait参数个数:1 //修饰符:public final 名称:wait参数个数:2 //修饰符:public final 名称:wait参数个数:0 //修饰符:public 名称:equals参数个数:1 //修饰符:public 名称:toString参数个数:0 //修饰符:public native 名称:hashCode参数个数:0 //修饰符:public final native 名称:getClass参数个数:0 //修饰符:public final native 名称:notify参数个数:0 //修饰符:public final native 名称:notifyAll参数个数:0 //修饰符:public 名称:interfaceMethod3参数个数:0
-
public Method getMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException 根据函数名和参数类型,获取Method(能获取到的Method和上面一样)
Class cls = Person.class; Person person = new Person(); try{ Method method = cls.getMethod("method1",String.class); method.invoke(person,"参数1"); }catch (Exception e){ } //输出 //这是Method1 参数1
Method常用方法
-
public Class<?> getDeclaringClass() 获取声明该方法的类
-
public String getName() 获取方法名
-
public Parameter[] getParameters() 获取函数的参数
-
public int getModifiers() 获取方法修饰符
-
public Class<?> getReturnType() 获取返回值类型
-
public Type getGenericReturnType() 获取泛型返回值类型
-
public Type[] getGenericParameterTypes() 获取泛型参数类型
-
public boolean isVarArgs() 是否允许带有可变数量的参数
-
public boolean isSynthetic() 是否是合成构造函数
-
public boolean isDefault() 是否是接口中的默认函数
-
public Annotation[] getDeclaredAnnotations() 获取所有注解
-
public Object invoke(Object obj, Object... args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException 根据传入的对象和参数执行方法
Class cls = Person.class; Person person = new Person(); try{ //非静态方法传对象 Method method1 = cls.getMethod("method1",String.class); method1.invoke(person,"参数1"); //静态方法对象传null就行 Method method5 = cls.getMethod("method5",String.class); method5.invoke(null,"参数5"); }catch (Exception e){ } //输出 //这是Method1 参数1 //这是Method5
网友评论