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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈艳南 中级黑马   /  2013-5-12 21:53  /  1679 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈艳南 于 2013-5-13 21:47 编辑

各位大神,看到一题很少烦恼,请各位帮忙,题目如下:如何利用反射实例化一个类.

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

11 个回复

倒序浏览
用反射机制来实例化一个类,有两种途径。如果使用无参的构造方法,直接使用Class类的new Instance()方法即可;若需要使用特定的构造方法来创建对象,则需要先获取
Constructor实例,再用new Instance()方法创建对象
回复 使用道具 举报
用反射方式执行某个类中的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-13 08:45
哈哈哈 哈哈哈哈哈  发表于 2013-5-13 08:44
鑫鑫你真扯,人家问实例化一个类,你整main函数调用  发表于 2013-5-13 06:37
厉害,虽然我看不懂 但是肯定牛B~棒  发表于 2013-5-12 22:28
回复 使用道具 举报
尹桥印 发表于 2013-5-12 21:58
呃,这个是哪的面试题目呐

我在一本java书上看到过,是面试题
回复 使用道具 举报
本帖最后由 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);
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
我百度了一下 有这个题的呀。。怎么不去看看呢
回复 使用道具 举报
明天,你好 发表于 2013-5-12 21:56
用反射机制来实例化一个类,有两种途径。如果使用无参的构造方法,直接使用Class类的new Instance()方法即 ...

谢谢啊
回复 使用道具 举报
孙百鑫 发表于 2013-5-12 22:03
用反射方式执行某个类中的main方法:
目标:

谢谢啊  挺详细的 初学者长见识啊
回复 使用道具 举报
fjl_fight 发表于 2013-5-12 22:25
Class c=Class.forName(“包.类”);
类 实例=c.newInstance();//如果存在无参构造
//如果不存在无参构造

谢谢!.......
回复 使用道具 举报
楼主注意结贴。。
回复 使用道具 举报
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();
   
        }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马