Adding graph traversal to find cycles; adding debug mode for ConflictTracker.
[jpf-core.git] / src / main / gov / nasa / jpf / util / TypeRef.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.util;
20
21 import gov.nasa.jpf.vm.ClassInfo;
22 import gov.nasa.jpf.vm.ClassLoaderInfo;
23
24 /**
25  * this is a utility construct for type references that should
26  * not cause class loading when instantiated, but cannot use a
27  * classname String because of argument type ambiguity (Strings are just
28  * used everywhere).
29  * 
30  * TypeRefs can be used to specify both native and JPF executed (SUT) classes,
31  * it is up to the caller to use the proper access methods
32  *
33  * NOTE - loading and instantiation of TypeRefs is not allowed to cause loading of
34  * any JPF classes that are not in jpf-classes.jar
35  */
36 public class TypeRef {
37   String clsName;
38
39   public TypeRef (String clsName){
40     this.clsName = clsName;
41   }
42   
43   public Class<?> getNativeClass() throws ClassNotFoundException {
44     return Class.forName(clsName);
45   }
46
47   /**
48    * return the host VM class for this ref.
49    * This will cause native on-demand class loading
50    */
51   public <T> Class<? extends T> asNativeSubclass(Class<T> superClazz) throws ClassNotFoundException, ClassCastException {
52     Class<?> clazz = Class.forName(clsName);
53     return clazz.asSubclass(superClazz);
54   }
55
56   /**
57    * obtain the ClassInfo (JPF class) for this ref.
58    * This will cause on-demand class loading by JPF
59    */
60   public ClassInfo getClassInfo (){
61     return ClassLoaderInfo.getCurrentResolvedClassInfo(clsName);
62   }
63   
64   @Override
65   public String toString(){
66     return "TypeRef(" + clsName + ")";
67   }
68 }