我有两个类
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中学习它,看到了它的其他相关堆栈溢出问题。在 Java 中动态加载类但是它不起作用,我一直收到错误b是未知的,z是未知的符号。还有没有办法使用目录文件名(例如:C:\NNK\pack2\eg)来加载类
这是一个范围问题。将 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
除了 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());
}