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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张 涛 中级黑马   /  2012-9-10 18:16  /  1530 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张 涛 于 2012-9-23 07:20 编辑

我的代码:
  1. package Reflection;

  2. import java.lang.reflect.*;

  3. public class ReflectionTest {

  4.         public static void main(String[] args) throws Exception {
  5.                
  6.                 //名字由执行时的参数传入,在runConfiger里设置;传入后字符串就在args[0]里
  7.                 //第一步,由名字得到字节码
  8.                 Class c = Class.forName(args[0]);
  9.                 //第二步,由字节码获得main方法。第一个参数是方法名字,后面是可变参数,类型是Class
  10.                 Method m = c.getMethod("main", String[].class);
  11.                 //第三步,执行
  12.                 m.invoke(null, new String[]{"1","2","3"});
  13.         }
  14. }
复制代码
另一个类:
  1. package Reflection;

  2. public class ReflectPrint {
  3.         public static void main(String[] args) {
  4.                 for(String s : args){
  5.                         System.out.println(s);
  6.                 }
  7.         }
  8. }
复制代码
这是张老师视频里讲过的反射调用另一个类的main方法。第一个类里用反射机制调用第二个类的main方法,第二个类的main方法就是打印传入的参数值,这里在调用时传入的1,2,3.

执行第一个类时,要传入第二个类的名字,因为是在eclipse中,所以在runConfigeration中设置,设置的路径的地方已经用红笔标出。路径我写了三种,但都不对,错误是找不到Class。
三种分别是:D:\workspace\HeiMa\src\Reflection\ReflectPrint.java;
Reflection\ReflectPrint.java;
ReflectPrint.java
都不对。
下面我把我的工程目录和设置参数的图片加在下面,高手给讲下路径的问题。
1.这里应该是相对路径,那么父路径是什么?
2.张老师还说classpaht的相对路径,是指什么?

a.png (19.92 KB, 下载次数: 23)

设置参数

设置参数

b.png (9.9 KB, 下载次数: 46)

工程目录

工程目录

3 个回复

倒序浏览
稍等哈哈!!
回复 使用道具 举报
本帖最后由 王红潮 于 2012-9-10 18:41 编辑

我运行试了一下,有一下几个错误
public class ReflectionTest {
        public static void main(String[] args) throws Exception {
               
                //名字由执行时的参数传入,在runConfiger里设置;传入后字符串就在args[0]里
                //第一步,由名字得到字节码
                Class c = Class.forName(args[0]);
                //第二步,由字节码获得main方法。第一个参数是方法名字,后面是可变参数,类型是Class
                Method m = c.getMethod("main", String[].class);
                //第三步,执行
                m.invoke(c.newInstance(), (Object)new String[]{"1","2","3"});
        }
}

首先invoke这里必须传入是哪个对象,而且数组传过去必须要封装要么前面加(Object)String[]{"1","2"}告诉编译器传进去的是个对象,要么用Object数组封装 new Object[]{new String[]{"1","2"}}
传入的路径用相对路径就可以 ,即  包名称. 类名称即可 Reflection.ReflectPrint

回复 使用道具 举报
我调用的是另一个类的main方法,静态的,所以invoke的第一个参数写null就可以
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马