Jelajahi Sumber

new: IClass#symbolic
new: IClass: standard primitive types (OBJECT, VOID, INT, etc)

Mariusz Sieroń 6 tahun lalu
induk
melakukan
92b0c5c833

+ 1 - 1
assira/src/main/java/net/ranides/assira/reflection/IAttribute.java

@@ -76,7 +76,7 @@ public enum IAttribute {
     
     BOOLEAN         (0x00100000, 0),   // special: traits
     
-    //RESERVED        (0x08000000),
+    SYMBOLIC        (0x08000000),
     
     //RESERVED        (0x00800000),
     

+ 17 - 3
assira/src/main/java/net/ranides/assira/reflection/IClass.java

@@ -13,6 +13,7 @@ import java.util.Optional;
 
 import net.ranides.assira.reflection.impl.AClass;
 import net.ranides.assira.reflection.impl.FClass;
+import net.ranides.assira.reflection.impl.SClass;
 import net.ranides.assira.reflection.util.ClassUtils;
 
 /**
@@ -23,10 +24,19 @@ import net.ranides.assira.reflection.util.ClassUtils;
 public interface IClass<T> extends IElement, Comparable<IClass<?>> {
 
     @SuppressWarnings({"raw", "unchecked"})
-    IClass NULL = new AClass(IContext.DEFAULT){};
+    IClass NULL = new AClass(IContext.DEFAULT) { };
+
+    IClass<Object>    OBJECT = typeinfo(Object.class);
+    IClass<Void>      VOID   = typeinfo(void.class);
+    IClass<Byte>      BYTE   = typeinfo(byte.class);
+    IClass<Short>     SHORT  = typeinfo(short.class);
+    IClass<Integer>   INT    = typeinfo(int.class);
+    IClass<Long>      LONG   = typeinfo(long.class);
+    IClass<Float>     FLOAT  = typeinfo(float.class);
+    IClass<Double>    DOUBLE = typeinfo(double.class);
+    IClass<Character> CHAR   = typeinfo(char.class);
+    IClass<String>    STRING = typeinfo(String.class);
 
-    IClass<?> OBJECT = typeinfo(Object.class);
-    
     /**
      * Collect information using java.reflection API
      * @param type
@@ -59,6 +69,10 @@ public interface IClass<T> extends IElement, Comparable<IClass<?>> {
     static <R> IClass<R> generic(Class<R> type, Class<?>... params) {
         return FClass.newClass(type, Arrays.stream(params).map(IClass::typeinfo).toArray(IClass<?>[]::new));
     }
+
+    static IClass<?> symbolic(String name) {
+        return new SClass(name);
+    }
     
     @Override
     IClasses collect();

+ 2 - 4
assira/src/main/java/net/ranides/assira/reflection/ResolveStrategy.java

@@ -115,8 +115,6 @@ public abstract class ResolveStrategy implements Serializable {
     private static class EHFormat extends EHThrow {
         
         private static final long serialVersionUID = 1L;
-        
-        private static final IClass<String> STRING = IClass.typeinfo(String.class);
 
         @Override
         public Object get(ResolvePattern resolver) {
@@ -130,12 +128,12 @@ public abstract class ResolveStrategy implements Serializable {
         
         @Override
         public IClass<?> type(ResolvePattern resolver) {
-            return STRING;
+            return IClass.STRING;
         }
         
         @Override
         public IClass<?> type(ResolvePattern resolver, String token) {
-            return STRING;
+            return IClass.STRING;
         }
         
     }

+ 75 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/SClass.java

@@ -0,0 +1,75 @@
+package net.ranides.assira.reflection.impl;
+
+import net.ranides.assira.reflection.IAttribute;
+import net.ranides.assira.reflection.IAttributes;
+import net.ranides.assira.reflection.IClass;
+
+import java.lang.reflect.Type;
+import java.util.NoSuchElementException;
+
+public class SClass extends AClass<Object> {
+
+    private static final IAttributes ATTRS = IAttributes.of(IAttribute.SYMBOLIC).immutable();
+
+    private final String fqn;
+
+    private final Type type;
+
+    public SClass(String fqn) {
+        this.fqn = fqn;
+        this.type = new Type(){
+            @Override
+            public String toString() {
+                return fqn;
+            }
+        };
+    }
+
+    @Override
+    public IClass<?> parent() {
+        return OBJECT;
+    }
+
+    @Override
+    public IClass<?> outer() {
+        int i = fqn.lastIndexOf('$');
+        return i < 0 ? NULL : new SClass(fqn.substring(i + 1));
+    }
+
+    @Override
+    public Type reflective() {
+        return type;
+    }
+
+    @Override
+    public Class<?> raw() {
+        throw new NoSuchElementException("Symbolic IClass<"+fqn+"> is not reflective");
+    }
+
+    @Override
+    public boolean isInstance(Object value) {
+        return false;
+    }
+
+    @Override
+    public Object cast(Object value) {
+        throw new ClassCastException(value + " is not instance of " + name());
+    }
+
+    @Override
+    public String name() {
+        return fqn;
+    }
+
+    @Override
+    public String shortname() {
+        int i = fqn.lastIndexOf('.');
+        return i < 0 ? fqn : fqn.substring(i + 1);
+    }
+
+    @Override
+    public IAttributes attributes() {
+        return ATTRS;
+    }
+
+}

+ 3 - 4
assira/src/main/java/net/ranides/assira/reflection/impl/bean/RBeanModel.java

@@ -27,9 +27,8 @@ public class RBeanModel implements BeanModel {
     
     private static final Set<String> OBJECT_METHODS = new HashSet<>(new String[]{"toString","hashCode","equals"});
     
-    private static final IArguments INT_ARGS = IArguments.typeinfo(int.class);
-    private static final IClass<?> INT_ARG = IClass.typeinfo(int.class);
-    
+    private static final IArguments INT_ARGS = IArguments.typeinfo(IClass.INT);
+
     private final IClass<?> type;
     private final Map<String, BeanMethod> methods;
     private final Map<String, BeanProperty> properties;
@@ -205,7 +204,7 @@ public class RBeanModel implements BeanModel {
         if(args.size()!=2) {
             return false;
         }
-        if(!args.get(0).equals(INT_ARG)) {
+        if(!args.get(0).equals(IClass.INT)) {
             return false;
         }
         if(!method.returns().attributes().contains(IAttribute.VOID) && !method.returns().equals(method.parent())) {

+ 1 - 3
assira/src/main/java/net/ranides/assira/reflection/impl/bean/RBeanPropertyInfo.java

@@ -20,8 +20,6 @@ import net.ranides.assira.reflection.util.ClassUtils;
  */
 public class RBeanPropertyInfo {
     
-    private static final IClass<?> IC_INT = IClass.typeinfo(int.class);
-    
     private final String name;
     
     private final List<IMethod> vsetters = new ArrayList<>(2);
@@ -122,7 +120,7 @@ public class RBeanPropertyInfo {
     
     private void initISetter() throws IllegalArgumentException {
         if(item != null) {
-            isetter = isetters.stream().filter(m -> m.matches(IC_INT, item)).findFirst().orElse(null);
+            isetter = isetters.stream().filter(m -> m.matches(IClass.INT, item)).findFirst().orElse(null);
         } else {
             if( isetters.size() > 1) {
                 throw new IllegalArgumentException("Ambigous property setters for: " + name);

+ 1 - 3
assira/src/main/java/net/ranides/assira/xml/impl/W3Element.java

@@ -45,8 +45,6 @@ import org.w3c.dom.DOMException;
  */
 public class W3Element extends CElement implements XMLElement {
     
-    private static final IClass<?> TYPE = IClass.typeinfo(String.class);
-    
     private static final XMLSelector NORMALIZE = XMLSelector.compile("? //text()[normalize-space(.) = '']");
     
     protected W3Element(Node node) {
@@ -69,7 +67,7 @@ public class W3Element extends CElement implements XMLElement {
 
     @Override
     public IClass<?> type() {
-        return TYPE;
+        return IClass.STRING;
     }
 
     @Override