【问题标题】:How to use ClassLoader or Class to programatically load a Class如何使用 ClassLoader 或 Class 以编程方式加载 Class
【发布时间】:2016-11-19 09:02:42
【问题描述】:

我有两节课

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

【问题讨论】:

  • 阅读 Java 范围规则。你必须在第一个try之前在顶层声明bz

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


【解决方案1】:

这是一个范围问题。将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

【讨论】:

  • 有没有办法在不知道加载的类名的情况下做到这一点。我已经创建了eg z,但是如果我不知道类名怎么办。我可以使用 Object 并做到这一点吗?如果是,那是什么方法
  • 错误被抛出为未知符号,例如。 o 我改了。 Object b; try { b=Class.forName("pack2.eg").newInstance(); } catch(ClassNotFoundException e){ e.printStackTrace(); } b.show(); 仍然会抛出错误,因为找不到符号 b。
【解决方案2】:

除了 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());
}

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2019-07-09
    • 1970-01-01
    • 2014-06-06
    • 2014-12-25
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多