源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

java反射获取和调用方法

  • 时间:2021-12-05 09:40 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java反射获取和调用方法
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);   更多相关的内容: [b]一:反射概念[/b] 可以通过Class类获取某个类的成员变量以及方法,并且调用之。 [b]二:通过反射获取方法、变量、构造方法[/b]
@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());
  }
 }
[b]三:通过反射调用类定义的方法[/b]
@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);
 }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部