A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曾_强 于 2012-6-29 08:47 编辑

通过配置文件,利用反射调用无参数的的run方法的一个小问题问题。


拥有run()方法的类。利用配置文件获取其类名。
  1. public class DemoClass {
  2.         public void run(){
  3.                 System.out.println("welcome!");
  4.         }        
  5. }
复制代码
config.properties文件中就是类名的。
  1. className=DemoClass
复制代码
这都没有问题。在调用的是后出现问题:不知道在通过getMethod方法获取类中方法是参数不确定的问题。
  1. public class PropertiesDemo {

  2.         /**
  3.          * @param args
  4.          * @throws Exception
  5.          */
  6.         public static void main(String[] args) throws  Exception {
  7.                
  8.                 File confile = new File("config.properties");
  9.                
  10.                 if (!confile.exists()) {
  11.                         confile.createNewFile();
  12.                 }
  13.                
  14.                 FileInputStream fis = new FileInputStream(confile);               
  15.                
  16.                 Properties prop = new Properties();
  17.                
  18.                 prop.load(fis);
  19.                
  20.                 prop.list(System.out);//控制台输出 :className=DemoClass 证明是读取到了配置文件               
  21.                
  22.                 String className = prop.getProperty("className");
  23.                
  24.                 System.out.println(className);//输出类名,DemoClass。
  25.                
  26.                 /*Class clazz = Class.forName(className);
  27.                
  28.                 Method method = clazz.getMethod("run", null);
  29.                
  30.                 Object obj = clazz.newInstance();               
  31.                
  32.                 method.invoke(obj, null);*/                        
  33.                

  34.                 Method methodRun = Class.forName(className).getMethod("run",void.class);
  35.                
  36.                 methodRun.invoke(obj, null);
  37.         }

  38. }
复制代码
Class实例有9个预定义对象  (8种基本数据类型和void都有对应的Class对象),所以想到可能为void.class.

综上:
能够正确获取类名,想要利用反射:类名.class  或者  ClassforName(类名)去调用run()方法。纠结于在调用getMethod方法获取类的run方法时不知道参数类型的时候,有没有什么办法解决啊?

Method methodRun = Class.forName(className).getMethod("run",void.class/*参数类型怎么确定*/);

methodRun.invoke(obj, null);//调用方法invoke里面的参数也不大清楚。

通过查阅API:
Class类中getMethod方法。
MethodgetMethod(String name, Class<?>... parameterTypes)  
知道getMethod("方法名",parameterTypes );void时,设置为null .然后再利用自建Object对象,作为invoke参数传递。

Method methodRun = Class.forName(className).getMethod("run",null);
Object obj = Class.forName(className).newInstance();
methodRun.invoke(obj, null);
这样就行了。

thanks anyway !

话说刘兄超级敬业和夜猫呀。

点评

还一个是别放在默认包里,放在其他包里,配置文件写上包名  发表于 2012-6-29 02:06
你要是有对象的话,直接用对象来反射最安全,如果是根据配置文件加载进行反射调用,比较靠谱的是你先输出下这个类的完整名字  发表于 2012-6-29 02:05

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马