如何使用ClassLoader或Class以编程方式加载类

时间:2016-07-16 05:46:56

标签: java class reflection classloader dynamic-class-loaders

我有两个班级

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)来加载类

2 个答案:

答案 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)

这是一个范围问题。将bz的声明移到第一个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