// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqFindInstance
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqFindInstance
:description: Apache NetBeans wiki DevFaqFindInstance
:toc: left
:toc-title:
:syntax: true

=== I have a .instance file. How do I get an actual object instance?

Using `InstanceCookie` (note that if you have an entire folder of `.instance` files, there's a link:DevFaqFolderOfInstances.asciidoc[more efficient way ] to get all of them):

[source,java]
----

DataObject dob = DataObject.find (theDotInstanceFileObject);
InstanceCookie ck = dob.getLookup().lookup(InstanceCookie.class);
MyObject obj = (MyObject) ck.instanceCreate();

----

(you can and should call `ck.instanceClass()` to ensure the type cast is correct ahead of time)

==== Alternative:

[source,java]
----

T obj=FileUtil.getConfigObject("Actions/Window/org-foo-B.instance", T.class) 

//for example:
Action action=FileUtil.getConfigObject("Actions/Window/org-netbeans-core-windows-actions-ResetWindowsAction.instance", Action.class) 

----

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqFindInstance[http://wiki.netbeans.org/DevFaqFindInstance] , 
that was last modified by NetBeans user Markiewb 
on 2013-03-31T16:20:03Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
