我有两个班级
package pack2;
import java.lang.*;
import java.io.*;
class eg
{
public void show()
{
System.out.println("ClassPath set to this class");
}
}
这是在C:\ NNK \ pack2中。完全限定名称为pack2.eg
另一个程序是
import java.io.*;
import java.lang.*;
import java.net.*;
class classload
{
public static void main(String args[])
{
//have to load the eg class here. Dont know what i have done below is right or wrong
try
{
Class b=Class.forName("pack2.eg");
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
eg z=(eg) b.newInstance();
}
catch(InstantiationException l)
{
l.printStackTrace();
}
z.show();
System.out.println("b.getName()="+b.getName());
}
}
此程序位于C:\ NNK 我必须在这里加载eg程序。我试图在Oracle中学习它,看到了其他相关的堆栈溢出问题。 Dynamically loading a class in Java 但它不起作用我继续得到错误b是未知和z是未知的符号。 还有一种方法可以使用目录文件名(例如:C:\ NNK \ pack2 \ eg)来加载类
答案 0 :(得分:0)
除了Jim Garrison回答已经识别的多个错误之外,您已经使用“默认”范围声明了您的类。这意味着它只能通过同一个包中的类引用。
应该是
public class eg // <== public
{
public void show()
{
System.out.println("ClassPath set to this class");
}
}
并且不需要单独的尝试捕获,为什么不从主方法抛出...如果任何步骤失败,例如定义b,你无论如何都做不了什么......
public static void main(String[] args) throws Exception {
Class b = Class.forName("pack2.eg");
eg z = (eg)b.newInstance();
z.show();
System.out.println("b.getName()=" + b.getName());
}
答案 1 :(得分:0)
这是一个范围问题。将b
和z
的声明移到第一个try
之外,如下所示:
public static void main(String args[])
{
//have to load the eg class here. Dont know what i have done below is right or wrong
Class b;
eg z;
try
{
b=Class.forName("pack2.eg");
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
z=(eg) b.newInstance();
}
catch(InstantiationException l)
{
l.printStackTrace();
}
z.show();
System.out.println("b.getName()="+b.getName());
}
您可能还需要pack2.eg
public