| /******************************************************************************* |
| * Copyright (c) 2004, 2008 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.swt.tools.internal; |
| |
| import java.io.File; |
| import java.lang.reflect.Field; |
| import java.lang.reflect.Method; |
| |
| import org.eclipse.jdt.core.dom.AST; |
| import org.eclipse.jdt.core.dom.ASTParser; |
| import org.eclipse.jdt.core.dom.CompilationUnit; |
| |
| public class ReflectClass extends ReflectItem implements JNIClass { |
| Class<?> clazz; |
| ReflectField[] fields; |
| ReflectMethod[] methods; |
| MetaData metaData; |
| String sourcePath; |
| |
| public ReflectClass(Class<?> clazz) { |
| this(clazz, null, null); |
| } |
| |
| public ReflectClass(Class<?> clazz, MetaData data, String sourcePath) { |
| this.clazz = clazz; |
| this.metaData = data; |
| this.sourcePath = sourcePath; |
| } |
| |
| void checkMembers() { |
| if (fields != null) return; |
| String source = null; |
| CompilationUnit unit = null; |
| if (JNIItem.GEN64) { |
| source = JNIGenerator.loadFile(sourcePath); |
| ASTParser parser = ASTParser.newParser(AST.JLS4); |
| parser.setSource(source.toCharArray()); |
| unit = (CompilationUnit)parser.createAST(null); |
| } |
| Field[] fields = clazz.getDeclaredFields(); |
| this.fields = new ReflectField[fields.length]; |
| for (int i = 0; i < fields.length; i++) { |
| this.fields[i] = new ReflectField(this, fields[i], source, unit); |
| } |
| Method[] methods = clazz.getDeclaredMethods(); |
| this.methods = new ReflectMethod[methods.length]; |
| for (int i = 0; i < methods.length; i++) { |
| this.methods[i] = new ReflectMethod(this, methods[i], source, unit); |
| } |
| } |
| |
| @Override |
| public int hashCode() { |
| return clazz.hashCode(); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (!(obj instanceof ReflectClass)) return false; |
| return ((ReflectClass)obj).clazz.equals(clazz); |
| } |
| |
| public JNIField[] getDeclaredFields() { |
| checkMembers(); |
| JNIField[] result = new JNIField[fields.length]; |
| System.arraycopy(fields, 0, result, 0, result.length); |
| return result; |
| } |
| |
| public JNIMethod[] getDeclaredMethods() { |
| checkMembers(); |
| JNIMethod[] result = new JNIMethod[methods.length]; |
| System.arraycopy(methods, 0, result, 0, result.length); |
| return result; |
| } |
| |
| public String getName() { |
| return clazz.getName(); |
| } |
| |
| public JNIClass getSuperclass() { |
| Class<?> superclazz = clazz.getSuperclass(); |
| String path = new File(sourcePath).getParent() + "/" + getSimpleName(superclazz) + ".java"; |
| return new ReflectClass(superclazz, metaData, path); |
| } |
| |
| String getSimpleName(Class<?> type) { |
| String name = type.getName(); |
| int index = name.lastIndexOf('.') + 1; |
| return name.substring(index, name.length()); |
| } |
| |
| public String getSimpleName() { |
| return getSimpleName(clazz); |
| } |
| |
| public String getExclude() { |
| return (String)getParam("exclude"); |
| } |
| |
| @Override |
| public String getMetaData() { |
| String key = JNIGenerator.toC(clazz.getName()); |
| return metaData.getMetaData(key, ""); |
| } |
| |
| public void setExclude(String str) { |
| setParam("exclude", str); |
| } |
| |
| @Override |
| public void setMetaData(String value) { |
| String key = JNIGenerator.toC(clazz.getName()); |
| metaData.setMetaData(key, value); |
| } |
| |
| @Override |
| public String toString() { |
| return clazz.toString(); |
| } |
| |
| } |