您的位置:首页 > 其它

反射第四步 : 通过反射获取某一个类的 方法 并通过反射调用

2017-08-21 11:45 302 查看
package cn.sdut.reflectclass;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

/*
* 反射第四步 :   通过反射获取某一个类的 方法     并通过反射调用
*
* 			带有 “Declared”的方法  无论什么访问权限的方法都可访问
* 			不带有 “Declared”的方法  只可访问public的方法
*/
class B{

public void show1(){
System.out.println("show1");
}
public void show2(int a){
System.out.println("show2"+a);
}
private void show3(String[] b){
System.out.println("show3"+Arrays.toString(b));
}

public static void show4(){
System.out.println("静态");
}

}
public class ReflectDemo04 {

public static void main(String[] args) throws Exception {
//1.获取B的Class对象
Class clz = Class.forName("cn.sdut.reflectclass.B");//换了一种方式,取得B的Class对象
/*
* 2.获取所有无论访问权限的方法。
* getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
* getMethods()返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
*/
Method[] m = clz.getDeclaredMethods();
for (Method method : m) {
System.out.println(method);
}
//3.获取一个方法并调用
Constructor<B> cb = clz.getDeclaredConstructor();//通过反射获得默认构造器  访问权限是default 所以用"Declared"
B b = cb.newInstance();//创建实例对象
Method m1 = clz.getMethod("show2",int.class);//获得方法
m1.invoke(b,new Object[]{10});//塞进实例和参数  调用方法完成     打印输出:show210
Method m2 = clz.getDeclaredMethod("show3",String[].class);//获得方法
m2.setAccessible(true);
m2.invoke(b,new Object[]{new String[]{"1","2","x"}});//塞进实例和参数  调用方法完成     打印输出:show3[1, 2, x]
//4: 获取方法的返回值
Class returnType = m1.getReturnType();
System.out.println(returnType);
//5:获取方法的修饰符
int modifiers = m2.getModifiers();
Modifier mo = new Modifier();
String str = mo.toString(modifiers);
System.out.println(str);

//访问静态方法
Method m4 = clz.getMethod("show4",null);//获得方法
m4.invoke(null,new Object[]{});//静态方法 不需要实例对象 第一个参数为null

//....还有获取参数的类型,各式各样可以去看API
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: