package org.xpect.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.eclipse.xtext.common.types.JvmField; import org.eclipse.xtext.common.types.JvmOperation; import org.eclipse.xtext.common.types.JvmType; import org.eclipse.xtext.common.types.util.JavaReflectAccess; import org.eclipse.xtext.resource.XtextResourceSet; @SuppressWarnings("restriction") public interface IJavaReflectAccess { public class Delegate implements IJavaReflectAccess { private IJavaReflectAccess delegate; public Field getField(JvmField field) { return delegate.getField(field); } public Method getMethod(JvmOperation operation) { return delegate.getMethod(operation); } public Class<?> getRawType(JvmType type) { return delegate.getRawType(type); } public void setDelegate(IJavaReflectAccess delegate) { this.delegate = delegate; } } public class RuntimeJavaReflectAccess implements IJavaReflectAccess { public Field getField(JvmField field) { XtextResourceSet resourceSet = (XtextResourceSet) field.eResource().getResourceSet(); JavaReflectAccess access = new JavaReflectAccess(); access.setClassLoader((ClassLoader) resourceSet.getClasspathURIContext()); return access.getField(field); } public Method getMethod(JvmOperation operation) { XtextResourceSet resourceSet = (XtextResourceSet) operation.eResource().getResourceSet(); JavaReflectAccess access = new JavaReflectAccess(); access.setClassLoader((ClassLoader) resourceSet.getClasspathURIContext()); return access.getMethod(operation); } public Class<?> getRawType(JvmType type) { XtextResourceSet resourceSet = (XtextResourceSet) type.eResource().getResourceSet(); JavaReflectAccess access = new JavaReflectAccess(); access.setClassLoader((ClassLoader) resourceSet.getClasspathURIContext()); return access.getRawType(type); } } public static final IJavaReflectAccess INSTANCE = EcorePlugin.IS_ECLIPSE_RUNNING ? new Delegate() : new RuntimeJavaReflectAccess(); Field getField(JvmField field); Method getMethod(JvmOperation operation); Class<?> getRawType(JvmType type); }