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行之间的区别。我可以通过这两种方法获得相同的结果。
没有功能上的区别。正如您所发现的,有各种方法可以获取class
对象并实例化该类的实例。然而,它们都导致了相同的结果。
一般来说,除非另有需要,否则请始终:
getclass()
获取类
class
cl=foo.class;
类<?扩展foo>cl=fooinstance.getclass();
类
cl=foo.class;
类<?扩展foo>cl=fooinstance.getclass();
class
cl=class.forname(“some.package.foo”);
class.forname(“some.package.foo”,true,currentClassLoader)
问题评论中的链接讨论了为什么要使用方法3或4。
再一次从我的脑海中浮现出来,这些是我能想到的实例化对象的方法:
new
关键字
Foo f=new Foo();
问题内容: 直接使用和直接使用父类名称之间有区别吗?例如: 是否有内部之间的差异和? 问题答案: 在 这种情况下 不是。但是 通常 ,尤其是当您使用 多重继承时 ,按照文档中指定 的 方法 委托给 方法解析顺序(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 ++中是合法的: 但是,必须定义一次。如果忘记定
谢谢你抽出时间。 问候,