使用Class.forName()而不是new关键字来加载实例有什么好处?

时间:2017-03-16 11:07:58

标签: java reflection

我知道定义。当我们不知道班级的类型时,我们会使用Class.forName(""),但这就是这里的难题。

如果我说:

Class.forName("SomeClass");

所以我知道“SomeClass”的类型。因此,在Class.forName("SomeClass")情况下,所有编译器都会在编译时不检查“SomeClass”是否存在。但它会在运行时检查它。但它真的有优势吗?任何人都可以通过实时场景向我解释这一点吗?

2 个答案:

答案 0 :(得分:1)

#import "PopupViewController.h" @interface PopupViewController () { @private Completionhandler _myHandler; } @end @implementation PopupViewController +(PopupViewController*)sharedInstance { static PopupViewController *popup=nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ popup = [[PopupViewController alloc] initWithNibName:@"PopupViewController" bundle:nil]; }); return popup; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)btnOkPressed:(id)sender { _myHandler(@"test msg"); } -(void)callCompletion:(Completionhandler)handler { _myHandler = handler; } @end 为您提供给定名称的。它没有实例化它。您可以使用Class.forName()(但有问题 - 请参阅here以获取更多信息)

请注意,您可以在(比方说)框架中使用它,其中配置文件标识要加载的类的名称。即该类可以在运行时中更改(例如,Spring XML配置)。在这些情况下,您选择的类很可能都会实现一个公共接口 - 否则后续代码很难与之交互。

答案 1 :(得分:0)

Class.forName()加载一个不需要在编译时出现的类 - 它只需要在Class.forName()执行时出现(通常是类加载时间,也可能是运行时,取决于指定指令的位置)。例如,数据库特定的数据库驱动程序通常就是这种情况,其中实现类由应用程序容器提供,而您在开发应用程序时无需关心实例。

在编译时加载类的替代方法是这样的:

import com.someclass.Foo;

Foo foo; // class would be loaded

但是,这仍然不是使用new关键字创建的类的实例。实例不同 - 如果您需要实例,则仍然使用new创建,与实际加载的方式无关。