Java:抓住一个不属于你的程序的课程

时间:2014-10-02 03:30:27

标签: java class reflection

所以说我有两个应用程序。第一个应用程序包含一个文件,并显示以下代码:

public class Ball{
    public static void main(String[] args){
        System.out.println("You have found the ball");
    }
}

第二个应用程序还包含一个文件:

import java.lang.reflect.Method;

public class Human{  
    private static Method[] methods = null;

    public static void main(String[] args){
      try{
          Class ball = Class.forName("sports.soccer.Ball"); // Error occurs here
          methods = ball.getDeclaredMethods();
          for (int i = 0; i < methods.length; i++) {
              methods[i].setAccessible(true);
          }
          //ball.main(); //This also doesn't work but I will read more on how to do this.
      }
      catch(Exception e){
            e.printStackTrace();
      }
    }
}

在Human.class所在的位置,有一个名为sports的文件夹,其中包含一个名为soccer的文件夹,其中包含第一个应用程序中Ball.class的副本。编译程序运行得很好,但是当我去运行它时会产生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: sports/soccer/ball (w
rong name: Ball)

//The rest of the error
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:259)
        at Human.main(Human.java:8)
Press any key to continue . . .

从查看第一个错误,并进行一些搜索显然它无法找到类文件,但我很困惑为什么它不能。这只是一个包装错误,还是我试图以错误的方式抓住课程?

指向文档的链接我的代码基于: http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

1 个答案:

答案 0 :(得分:0)

执行以下更改并再次运行代码

  1. 在两个类中声明包
  2. 编译具有Ball类的应用程序
  3. 编译具有Human class
  4. 的应用程序
  5. 运行Human类
  6. 此外, 类中的main方法是将String Array作为参数。这就是ball.main()没有执行的原因。类的主要方法也是静态方法。我们不想创建一个对象来调用静态方法。

    我已经测试了上述步骤并且工作正常。


    包sport.soccer;

    公共课Ball {

      public static void main(String[] args) {
          System.out.println("You have found the ball");
      }
    

    }


    包Man;

    import java.lang.reflect.Method;

    public class Human {

     private static Method[] methods ;
    
     public static void main(String[] args){
        try{
            Class ball = Class.forName("sport.soccer.Ball"); 
            methods = ball.getDeclaredMethods();
            for (int i = 0; i < methods.length; i++) {
                methods[i].setAccessible(true);
            }
            sport.soccer.Ball.main(new String[]{}); 
        }
        catch(Exception e){
            e.printStackTrace();
        }
      }
    

    }


    祝你好运!!!