📄 classdescriptor.java
字号:
package jnicli;import java.lang.reflect.*;import java.util.*;class ClassDescriptor { Class cls; int[] types; Field[] fields; long td; Constructor constructor; static final Object[] bypassFlag = { new Boolean(true) }; static Method setBypass; static final Class[] constructorProfile = new Class[0]; static final Object[] constructorParameters = new Object[0]; static { try { // setAccessible() method is available only in JDK 1.2 Class c = Class.forName("java.lang.reflect.AccessibleObject"); Class[] param = { Boolean.TYPE }; setBypass = c.getMethod("setAccessible", param); } catch(Exception x) {} } Object newInstance() throws Exception { return constructor.newInstance(constructorParameters); } ClassDescriptor(Class c) { this.cls = c; Vector fieldList = new Vector(); try { buildFieldList(c, fieldList); } catch (Exception x) { throw new CliException(x.getMessage()); } fields = new Field[fieldList.size()]; fieldList.copyInto(fields); types = new int[fields.length]; for (int i = 0; i < fields.length; i++) { Field f = fields[i]; if (setBypass != null) { try { setBypass.invoke(f, bypassFlag); } catch(Exception x) {} } Class type = f.getType(); int cliType; if (type == Byte.TYPE) { cliType = DatabaseJNI.TP_INT1; } else if (type == Short.TYPE) { cliType = DatabaseJNI.TP_INT2; } else if (type == Integer.TYPE) { cliType = DatabaseJNI.TP_INT4; } else if (type == Boolean.TYPE) { cliType = DatabaseJNI.TP_BOOL; } else if (type == Character.TYPE) { cliType = DatabaseJNI.TP_CHAR; } else if (type == Long.TYPE) { cliType = DatabaseJNI.TP_INT8; } else if (type == Float.TYPE) { cliType = DatabaseJNI.TP_REAL4; } else if (type == Double.TYPE) { cliType = DatabaseJNI.TP_REAL8; } else if (type == String.class) { cliType = DatabaseJNI.TP_STRING; } else if (type == Date.class) { cliType = DatabaseJNI.TP_DATE; } else if (type.isArray()) { type = type.getComponentType(); if (type == Boolean.TYPE) { cliType = DatabaseJNI.TP_BOOL_ARRAY; } else if (type == Character.TYPE) { cliType = DatabaseJNI.TP_CHAR_ARRAY; } else if (type == Byte.TYPE) { cliType = DatabaseJNI.TP_INT1_ARRAY; } else if (type == Short.TYPE) { cliType = DatabaseJNI.TP_INT2_ARRAY; } else if (type == Integer.TYPE) { cliType = DatabaseJNI.TP_INT4_ARRAY; } else if (type == Long.TYPE) { cliType = DatabaseJNI.TP_INT8_ARRAY; } else if (type == Float.TYPE) { cliType = DatabaseJNI.TP_REAL4_ARRAY; } else if (type == Double.TYPE) { cliType = DatabaseJNI.TP_REAL8_ARRAY; } else { throw new CliException("Unsupported array type " + type.getName()); } } else { throw new CliException("Unsupported field type " + type.getName()); } types[i] = cliType; } try { constructor = c.getDeclaredConstructor(constructorProfile); } catch(Exception x) { throw new CliException("Default constructor is not accessible in class " + c.getName()); } if (setBypass != null) { try { setBypass.invoke(constructor, bypassFlag); } catch (Exception x) {} } } void buildFieldList(Class c, Vector list) throws Exception { Class superclass = c.getSuperclass(); if (superclass != null) { buildFieldList(superclass, list); } Field[] flds = c.getDeclaredFields(); for (int i = 0; i < flds.length; i++) { Field f = flds[i]; if ((f.getModifiers() & (Modifier.STATIC|Modifier.TRANSIENT)) == 0) { list.addElement(f); } } } String getConstraints() throws Exception { StringBuffer buf = new StringBuffer(); getConstraints(cls, buf); return buf.toString(); } void getConstraints(Class c, StringBuffer buf) throws Exception { Class superclass = c.getSuperclass(); if (superclass != null) { getConstraints(superclass, buf); } try { Field f = c.getDeclaredField("CONSTRAINTS"); if (((f.getModifiers() & Modifier.STATIC) != 0)) { if (setBypass != null) { try { setBypass.invoke(f, bypassFlag); } catch (Exception x) {} } String constraints = (String)f.get(null); if (constraints != null) { buf.append(constraints); buf.append(','); } } } catch (NoSuchFieldException x) { } } String[] getFieldNames() { String names[] = new String[fields.length]; for (int i = 0; i < names.length; i++) { names[i] = fields[i].getName(); } return names; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -