Брошенный ClassNotFoundException
указывает, что загрузчик классов не смог найти класс для данного имени. Однако это не означает, что класс не существует в проекте. Существует высокая вероятность того, что строка не соответствует полному имени класса.
Имя класса включает в себя не только конкретное имя, но и пакеты.
Предположим, у нас есть класс
package foo.bar;
public class Test
{
public void shout()
{
System.out.println( "Hello World" );
}
}
также имя соответствующего класса в виде строки: "foo.bar.Test"
, а не просто "Test"
.
Также, когда вы создаете экземпляр объекта с помощью Reflection, возвращаемым типом является Object, и вы сохраняете его как единое целое, но при этом вы не можете получить доступ к методам класса:
String clazzname = "foo.bar.Test";
try
{
Object obj = Class.forName( clazzname ).newInstance();
//compiler error because java.lang.Object does not contain a method shout()
obj.shout();
}
Но поскольку мы уверены, что возвращенный Объект является по крайней мере экземпляром самого себя, мы должны быть в состоянии безопасно привести его к нужному объекту:
String clazzname = "foo.bar.Test";
try
{
foo.bar.Test obj = (foo.bar.Test)Class.forName( clazzname ).newInstance();
// does work now since obj is now treated as a 'Test' object.
obj.shout();
}
Я хочу создать переменную объекта динамически
К сожалению, это невозможно, поэтому вы должны отслеживать ваши экземпляры другим способом, например, сохраняя их в массиве или списке или любом другом виде.