本帖最后由 qianji20000420 于 2017-8-6 13:40 编辑

导读

  • 通过反射获取成员方法并遍历
  • 通过反射调用成员方法
  • 通过反射调用非公共成员方法


获取成员方法

  1. public class Demo_01 {
  2.         public static void main(String[] args) throws Exception {
  3.                 Class<?> c = Class.forName("indi.Tshoiasc.reflect.test_01");
  4.                
  5.         }
  6. }

  7. class test_01 {
  8.         public void a(){
  9.                
  10.         }

  11. }
复制代码
老样子,先把Class对象获取到。

然后查询API

发现和成员方法有关的有这四个方法。
那Declared就不用我说了吧,
那我们就获取所有的吧,然后遍历一下
  1. Method[] m = c.getDeclaredMethods();
  2.                 for(Method e:m){
  3.                         System.out.println(e);
  4.                 }
复制代码

那获取单个的呢?
  1. Method m = c.getDeclaredMethod("a");
复制代码
getDeclaredMethod的参数有两个 第一个是方法名 然后第二个是可变参 和之前构造方法的大同小异,都是传入方法参数对应的Class对象
那如果a方法加一个参数String 该如何获取呢
  1. Method m = c.getDeclaredMethod("a",String.class);
复制代码
当然就是这样啦。


调用成员方法

日常API:
既然这个机制叫反射,那调用应该也是反着调用。 我们就应该查看一下Method类的方法

找到了!
那就用它调用一下吧
我们还是先调用无参的
但是 , 那第一个参数是什么?  看API
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
那当然是传对象了。 就用我们之前讲的那个 newInstance来创建
  1. public class Demo_01 {
  2.         public static void main(String[] args) throws Exception {
  3.                 Class<?> c = Class.forName("indi.Tshoiasc.reflect.test_01");
  4.                 //创建对象
  5.                 test_01 t = (test_01) c.getConstructor().newInstance();
  6.                
  7.                 Method m = c.getDeclaredMethod("a");
  8.                 m.invoke(t);
  9.         }
  10. }

  11. class test_01 {
  12.         public test_01(){
  13.                
  14.         }
  15.         public void a(){
  16.                 System.out.println("yes");
  17.         }

  18. }
复制代码

这不就调用成功了?

那带参的怎么办呢?  一样
获取方法参考Part.1
只需要将invoke参数后面加上你需要传入的参数就行了
  1. Method m = c.getDeclaredMethod("a",String.class);
  2.                 m.invoke(t,"ccc");
复制代码


调用非公共成员方法

  1. private void a(String a){
  2.                 System.out.println(a);
  3.         }
复制代码
按照常规我们先把a的权限修饰符改成private
然后我们还是按上面的方式调用
是不是抛了异常 IllegalAccessException
这就不用我说了吧。
直接setAccessible(true);

什么私有,在反射面前都是渣渣~


导读

反射如何绕过泛型检查?
返回索引贴
第一次做教程,如果教程中有遗漏的或说错的地方请及时指出哇。~
[groupid=1181]Unknown Domain[/groupid]