日期:2014-05-20  浏览次数:20730 次

Java的反射机制!!Java高手请进!
通过一个方法名字符串,来调用该名字如何实现?
例如,已知Class为Test,其中有方法setTax,参数为String   tax;   怎么在程序中通过方法名及参数自动调用这个方法!!

------解决方案--------------------
Class Method
------解决方案--------------------
我们可以用 reflection 来做一些其它的事情,比如执行一个指定了名称的方法。下面的示例演示了这一操作:

import java.lang.reflect.*;
public class method2 {
public int add(int a, int b) {
return a + b;
}
public static void main(String args[]) {
try {
Class cls = Class.forName( "method2 ");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod( "add ", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
} catch (Throwable e) {
System.err.println(e);
}
}
}


------解决方案--------------------
public static void main(String[] args) throws SecurityException,
    NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
    InvocationTargetException, NoSuchFieldException {
  Test test = new Test();
  Class clazz = Test.class;
  // 方法一:调用 setTax 方法
  Method method = clazz.getMethod( "setTax ", String.class);
  method.invoke(test, "abc ");
  System.out.println(test.getTax());
  // 方法二:直接给 private 属性 tax 赋值,
  // 不通过 set 方法,Hibernate 就是类似这样做的
  Field field = clazz.getDeclaredField( "tax ");
  field.setAccessible(true);
  field.set(test, "123 ");
  System.out.println(test.getTax());
}

可恶的反射竟要抛出那么多的异常~~