我知道定义。当我们不知道班级的类型时,我们会使用Class.forName("")
,但这就是这里的难题。
如果我说:
Class.forName("SomeClass");
所以我知道“SomeClass”的类型。因此,在Class.forName("SomeClass")
情况下,所有编译器都会在编译时不检查“SomeClass”是否存在。但它会在运行时检查它。但它真的有优势吗?任何人都可以通过实时场景向我解释这一点吗?
答案 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
创建,与实际加载类的方式无关。