java的反射应用

时间:2023-01-29 10:23:02

  

class B{
public static void main(String[] arg){
Class c_a = Class.forName(packageName + "." + "A");
Object obj_a = c_a.newInstance();
Method do_m = c_a.getDeclaredMethod("do",new Class[]{});
//prepare data for the mathod
do_m.invoke(obj_a, new Object[]{});
}
}

原本觉得反射挺麻烦的,其实仔细看,想一想,其实反射也是很自然的。就好在其它的C++的代码中,如果需要调用DLL的话,也是需要先声明调用的方法,然后再调用的。反射很类似这种情况。先声明一个方法

Method m = c_a.getDeclaredMethod("do", new Class[]{});

然后再调用

m.invoke(obj_a, new Object[]{});

反射其实利用起来很简单,但是却可以解决很多问题,不可不说这是一个很好的工具。虽然代码显得比较多,但是细想之下,其实很也是很自然的事情,并不需要努力去记忆什么东西。

import java.lang.reflect.Method;

public class InvokeMethods {
 public static void main(String[] args) {
  Employee emp = new Employee();
  Class cl = emp.getClass();//是Class,而不是class
  // /getClass获得emp对象所属的类型的对象,Class就是类的类          
  // /Class是专门用来描述类的类,比如描述某个类有那些字段,          
  // /方法,构造器等等!
  try {
   // /getMethod方法第一个参数指定一个需要调用的方法名称
   // /这里是Employee类的setAge方法,第二个参数是需要调用 
   // 方法的参数类型列表,是参数类型!如无参数可以指定null 
   // /该方法返回一个方法对象 
   Method sAge = cl.getMethod("setAge", new Class[] { int.class });//参数必须和方法中一样int和Integer,double和Double被视为不同的类型
   Method gAge = cl.getMethod("getAge", null);
   Method pName = cl.getMethod("printName",
     new Class[] { String.class });
   
   Object[] args1 = { new Integer(25) };
   // 参数列表
   // emp为隐式参数该方法不是静态方法必须指定
   sAge.invoke(emp, args1);
   Integer AGE = (Integer) gAge.invoke(emp, null);
   int age = AGE.intValue();
   System.out.println("The Employee Age is: " + age);
   Object[] args3 = { new String("Jack") };
   pName.invoke(emp, args3);
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.exit(0);
 }
}

class Employee {
 // 定义一个员工类  
 public Employee() {
  age = 0;
  name = null;
 }
 // 将要被调用的方法  
 public void setAge(int a) {
  age = a;
 }
 // 将要被调用的方法  
 public int getAge() {
  return age;
 }
 // 将要被调用的方法
 public void printName(String n) {
  name = n;
  System.out.println("The Employee Name is: " + name);
 }
 private int age;
 private String name;
}