Android - forName()方法ClassNotFoundException

时间:2014-08-15 06:51:35

标签: java android eclipse reflection

我试图测试forName()的工作原理,但我出于某种原因得到ClassNotFoundException。这是我的代码:

package practicePackage;

import java.lang.Class;

public class mainClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            Class testSar = Class.forName("practicePackage.Animal");
            testSar.eat();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

这是我的包裹的完整视图 Image

我做错了什么?

修改

这是我的Animal.java文件:

package practicePackage;

public class Animal {
    int hunger;
    char[] food;
    int[] pos;
    int[] boundary;

    public Animal()
    {
        System.out.println("Animal Constructed..");
    }

    public void makeNoise()
    {
        System.out.println("Animal noise..");
    }

    public void eat()
    {
        System.out.println("Animal eat..");
    }

    public void sleep()
    {
        System.out.println("Animal sleep..");
    }

    public void roam()
    {
        System.out.println("Animal roam..");
    }

}

4 个答案:

答案 0 :(得分:4)

你调用eat方法的方式是错误的。当你这样做

Class testSar = Class.forName("practicePackage.Animal");

它返回Animal的类而不是Animal的实例。正确的做法是添加以下几行:

Animal instanceAnimal = (Animal)testStar.newInstance();
instanceAnimal.eat()

我不确定ClassNotFoundException。除了我上面提到的内容外,你的代码中的一切看起来都很好。

也许仔细检查一下你的文件是否没有从构建路径中排除,或者尝试使用另一个类,看看它是否也适用于其他类

答案 1 :(得分:3)

2 quick fixes available面板中,点击Surround with try/catch。这就是如何使用像forname()这样的方法:某些类可能并不总是可用,或者它可能存在,但它可能没有您正在寻找的方法。

如果你想真正调用eat()方法,你可以做的是:

Animal animal = (Animal) testSar.newInstance();
animal.eat();

试试这个。它应该工作。

答案 2 :(得分:1)

如果找不到您想要的课程,那么方法forName可能会引发那种异常,例如" practicePackage.Animal" 类。只需使用try-catch转换该句子或向该方法添加throws声明。

如果你想在Animal类中调用该方法,你必须创建该类的实例:

Class clazz = Class.forName("practicePackage.Animal");
Animal testSar = (Animal) clazz.newInstance();
testSar.eat();

答案 3 :(得分:0)

您可以使用具有默认构造函数/没有参数的成功加载的类:

Class<Animal> testSar = (Class<Animal>)Class.forName("practicePackage.Animal");
testSar.newInstance().eat();