// 
//     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.
//

= I have a .instance file. How do I get an actual object instance?
:jbake-type: wikidev
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqFindInstance
:description: Apache NetBeans wiki DevFaqFindInstance
:toc: left
:toc-title:
:syntax: true
:wikidevsection: _converting_between_common_data_types_and_finding_things
:position: 10

Using `InstanceCookie` (note that if you have an entire folder of `.instance` files, there's a xref:DevFaqFolderOfInstances.adoc[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.
////