黑马程序员技术交流社区

标题: 一道面试题 [打印本页]

作者: 沈艳南    时间: 2013-5-12 21:53
标题: 一道面试题
本帖最后由 沈艳南 于 2013-5-13 21:47 编辑

各位大神,看到一题很少烦恼,请各位帮忙,题目如下:如何利用反射实例化一个类.
作者: 明天,你好    时间: 2013-5-12 21:56
用反射机制来实例化一个类,有两种途径。如果使用无参的构造方法,直接使用Class类的new Instance()方法即可;若需要使用特定的构造方法来创建对象,则需要先获取
Constructor实例,再用new Instance()方法创建对象
作者: 孙百鑫    时间: 2013-5-12 22:03
用反射方式执行某个类中的main方法:
目标:

写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普
通方式调完后,大家要明白为什么要用反射方式去调啊?
问题:
启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射
方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4
的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种
语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的
参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[]{“xxx”}),javac只把它
当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。

解决办法:
mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
mainMethod.invoke(null,(Object)new String[]{"xxx"}); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不
会数组打散成若干个参数了
                //调用程序的main方法.
                //原始方法
                //TestArguments.main(new String[]{});
               
                //args[0],是确定要调用哪一个类.需要在编译的时候在名字后面加上运行类的全名
                //在运行类的名字上按F2获取类的全名.然后点右键选择Run As --> Open Run Dialod.. -->单击.在Argument,把类名粘贴上去
                String startCalssName = args[0];

                //用Class的forName方法获取类的名字.然后用类的名字调用getMethod方法.确定要调用的是main方法,里面传递才参数是String[]类型的
                Method maiMethod = Class.forName(startCalssName).getMethod("main",String[].class);

                //嗲用Method的Invoke方法给方法实例化.并传递进去字符数组"111","222","333",这里需要二维数组,因为传递进去的时候会拆包一次.
                System.out.println(maiMethod.invoke(null,new Object[]{new String[]{"111","222","333"}}));
作者: 明天,你好    时间: 2013-5-12 22:13
尹桥印 发表于 2013-5-12 21:58
呃,这个是哪的面试题目呐

我在一本java书上看到过,是面试题
作者: fjl_fight    时间: 2013-5-12 22:25
本帖最后由 fjl_fight 于 2013-5-12 23:06 编辑

Class<?> c=Class.forName(“包.类”);
类 实例=c.newInstance();//如果存在无参构造
//如果不存在无参构造
Constructor<?> con=c.getConstructor(Class<?>  parameterTypes);
///
  1. package fjl;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;

  4. class Person{
  5.         private String name;
  6.         private int age;
  7.         public Person(String name) {
  8.                 super();
  9.                 this.name = name;
  10.         }
  11.         public Person(String name, int age) {
  12.                 super();
  13.                 this.name = name;
  14.                 this.age = age;
  15.         }
  16.         public String getName() {
  17.                 return name;
  18.         }
  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }
  22.         public int getAge() {
  23.                 return age;
  24.         }
  25.         public void setAge(int age) {
  26.                 this.age = age;
  27.         }
  28. }
  29. public class XXX{
  30.         public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  31.                
  32.           Class<?> c=Class.forName("fjl.Person");
  33.          //取得Person(String name) 构造
  34.           Constructor<?> con=c.getConstructor(String.class);
  35.          //取得 Person(String name,int age) 构造
  36.           Constructor<?> con1=c.getConstructor(String.class,int.class);
复制代码

作者: 8047107    时间: 2013-5-12 22:29
我百度了一下 有这个题的呀。。怎么不去看看呢
作者: 沈艳南    时间: 2013-5-13 00:07
明天,你好 发表于 2013-5-12 21:56
用反射机制来实例化一个类,有两种途径。如果使用无参的构造方法,直接使用Class类的new Instance()方法即 ...

谢谢啊
作者: 沈艳南    时间: 2013-5-13 00:08
孙百鑫 发表于 2013-5-12 22:03
用反射方式执行某个类中的main方法:
目标:

谢谢啊  挺详细的 初学者长见识啊
作者: 沈艳南    时间: 2013-5-13 00:56
fjl_fight 发表于 2013-5-12 22:25
Class c=Class.forName(“包.类”);
类 实例=c.newInstance();//如果存在无参构造
//如果不存在无参构造

谢谢!.......
作者: 刘胜寒    时间: 2013-5-13 08:45
楼主注意结贴。。
作者: 何羡玉    时间: 2013-5-13 12:46
package enhanceTest;

import java.lang.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class reflectTest {
        public  reflectTest(){}
    public void printString()
    {
            System.out.println("哈哈哈");
    }
       
        public static void main(String[] args) throws Exception
        {
       
        Constructor constructor=Class.forName("enhanceTest.reflectTest").getConstructor(null);
    reflectTest re=(reflectTest)constructor.newInstance(null);
    re.printString();
   
        }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2