欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java反射获取和调用方法

程序员文章站 2023-12-04 11:42:16
class类中获取方法: public method[] getmethods();//获取包括自身和继承(实现)过来的所有的public方法——method不支持泛型&...

class类中获取方法:
public method[] getmethods();//获取包括自身和继承(实现)过来的所有的public方法——method不支持泛型<>,即后面不接<>
public method[] getdeclaredmethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getdeclaredmethod方法 对于method 的方法仍然需要设置
权限。
public method[] getmethod(string methodname, class<t>...parametertypes);//表示获取指定的一个公共的方法,包括继承的
参数: methodname:表示获取的方法的名字
parametertypes:表示获取的方法的参数的class类型
public method[] getdeclaredmethod(string methodname, class<t>...parametertypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法

class clazz = new person().getclass(); 
 try { 
  //调用指定的方法 
  /*@suppresswarnings("unchecked") 
  method me = clazz.getdeclaredmethod("getname", string.class); 
  me.invoke(clazz.newinstance(),"zhangsan");*/ 
  //获取所有的方法 
  method[] methods = clazz.getdeclaredmethods(); 
  for (method method : methods) { 
  system.out.println(method.getname()); 
  } 
 } catch (exception e) { 
  e.printstacktrace(); 
 } 

对于多个参数的方法调用:getdeclaredmethod后面跟的parametertypes可以理解为class类型的形参 ,通过调用invoke来赋实参 多个参数的赋值 最好是包装在new object[]{}中 。

@suppresswarnings("unchecked") 
method method = clazz.getdeclaredmethod("getname",new class[]{string.class,int.class}); 
method.invoke(new person(), new object[]{"zhangsan",10});

调用静态方法

class user{
public static void staticmethod(){
system.out.println(“static mthod invoke.”);
}
}
eg:
class<user> clz=user.class;
method staticmethod=clz.getmethod(“staticmthod”);

两种方式调用静态方法:

1. 因为静态方法属于所有实例对象公共的,可以创建该类的一个任意对象,通过该对象调用
staticmethod.invoke(clz.newinstance());//staticmethod无参,故参数列表类型不填

2. 如果底层方法是静态的,那么可以忽略指定的obj参数,将obj参数设置为null即可
staticmethod.invoke(null);

 

更多相关的内容:

一:反射概念

可以通过class类获取某个类的成员变量以及方法,并且调用之。

二:通过反射获取方法、变量、构造方法

@test
 // 通过反射获取类定义的方法
 public void testmethod() throws exception {
  @suppresswarnings("rawtypes")
  class clazz = class.forname("java.lang.string");
  method[] m = clazz.getdeclaredmethods();
  for (int i = 0; i < m.length; i++) {
   system.out.println(m[i].getname() + " " + m[i].getdeclaringclass());
  }
 }

 @test
 // 通过反射获取类定义的变量
 public void testfield() throws exception {
  @suppresswarnings("rawtypes")
  class clazz = class.forname("java.lang.string");
  field[] fields = clazz.getfields();
  for (field f : fields) {
   system.out.println(f.getname());
  }
 }

 @test
 // 通过反射获取类定义的构造方法
 public void testconstructor() throws exception {
  @suppresswarnings("rawtypes")
  class clazz = class.forname("java.lang.string");
  @suppresswarnings("rawtypes")
  constructor[] cons = clazz.getconstructors();
  for (@suppresswarnings("rawtypes")
  constructor c : cons) {
   system.out.println(c + " " + c.getdeclaringclass());
  }
 }

三:通过反射调用类定义的方法

@test
 // 通过反射调用类定义的方法
 public void testinvokemethod() throws exception {
  class clazz = class.forname("java.lang.string");
  // 定义参数类型
  class[] params = new class[1];
  params[0] = string.class;
  method m = clazz.getdeclaredmethod("indexof", params);
  // 设置参数
  object[] p = new object[1];
  p[0] = "e";
  integer s = (integer) m.invoke("helloworld!", p);
  system.out.println(s);
 }