当前位置: 首页 > 知识库问答 >
问题:

loadClass((“完全限定类名”)和.class.GetDeclaredConstructors之间有什么区别

朱淮晨
2023-03-14
class testMe{

    void show(){
        System.out.println("Hello");
    }

}

public class ClassloadersExample {
    public static void main(String args[]) {
        ClassLoader c = ClassloadersExample.class.getClassLoader(); //Line 1
        try {
            Class c1 = c.loadClass("test.testMe"); // Line 2
            Constructor a[] = c1.getDeclaredConstructors(); 
            for (Constructor constructor : a) {
                testMe m = (testMe)constructor.newInstance();
                m.show();
            }

            Constructor con[] = testMe.class.getDeclaredConstructors(); // Line 6
            for (Constructor constructor : con) {
                constructor.setAccessible(true);
                testMe t = (testMe)constructor.newInstance();
                t.show();
            }
        }
        catch(Exception e){
            System.out.println("exception");
        }

    }
}

我正在测试上面的代码。两者给我的结果是一样的。我正试图理解第1、2和6行之间的区别。我可以通过这两种方法获得相同的结果。

共有1个答案

晋安国
2023-03-14

没有功能上的区别。正如您所发现的,有各种方法可以获取class对象并实例化该类的实例。然而,它们都导致了相同的结果。

一般来说,除非另有需要,否则请始终:

  • 使用类文本或getclass()获取
    • 示例1:class cl=foo.class;
    • 示例2:类<?扩展foo>cl=fooinstance.getclass();
      null
    • 使用类文本
      • cl=foo.class;
      • 类<?扩展foo>cl=fooinstance.getclass();
      • class cl=class.forname(“some.package.foo”);
      • 这是class.forname(“some.package.foo”,true,currentClassLoader)
      • 的缩写
        null

      问题评论中的链接讨论了为什么要使用方法3或4。

      再一次从我的脑海中浮现出来,这些是我能想到的实例化对象的方法:

      • 使用new关键字
        • Foo f=new Foo();
          null
          null
        • 用“new”关键字创建并用反射创建的对象
        • 使用ClassLoader和class.forName加载类的区别
          • class.forname()vs classloader.loadclass()-使用哪个进行动态加载?[重复]

 类似资料:
  • 问题内容: 直接使用和直接使用父类名称之间有区别吗?例如: 是否有内部之间的差异和? 问题答案: 在 这种情况下 不是。但是 通常 ,尤其是当您使用 多重继承时 ,按照文档中指定 的 方法 委托给 方法解析顺序(MRO)中 的下一个对象 : 返回将方法调用委托给类型的父级或同级类的 代理对象 。这对于访问已在类中重写的继承方法很有用。搜索顺序与所使用的顺序相同,只是类型本身被跳过。 类型的 属性列

  • 从JLS关于受保护访问的详细信息: 让C是声明受保护成员的类。只允许在C的子类S的主体内进行访问。 此外,如果Id表示实例字段或实例方法,则: 如果访问是由限定名称Q. Id进行的,其中Q是ExpressionName,则当且仅当表达式Q的类型为S或S的子类时才允许访问。 如果通过字段访问表达式E.Id(其中E是主表达式)或方法调用表达式E.Id(…)进行访问,如果E是主表达式,则当且仅当E的类型

  • 问题内容: 它们有何不同?我有点困惑,因为它们似乎是相似的概念。 了解它们如何帮助优化编译时间? 问题答案: 从Swift自己的文档中: 类型安全 Swift是一种类型安全的语言。类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个String,则不能错误地将其传递给Int。 类型推断 如果您 未 指定所需的值类型,则Swift会使用类型推断来得出适当的类型。通过类型推断,编

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定