Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Reflection Getting information about classes Reflection uses the class Class The class called Class has many methods. ReflectUtil class demonstrates many reflection techniques String s = “java.util.Date”; Class c = Class.forName(s); Stuff you can discover Super-classes and interfaces methods fields parameters method need for invocation visibility modifiers data types of method returns data types of fields Accessors What is an accessor? a method that starts with “get” or “is” It returns a property. Customer c = new Customer(); c.getName(); // returns the name of the cust. c.isDeadbeat(); // returns true or false Mutators What is a mutator? A method that alters a property. A method that starts with “set” ReflectUtil ru = new ReflectUtil(new java.util.Date()); ru.getWriteMethodNames(); How do I convert a string into a method? Given a class, c: Method m = c.getMethod(s, new Class[]{}); For example Method main = c.getMethod(“main”, new Class[]{}); how do I invoke a method from a string? Given a static method, m, the first argument to invoke can be null. m.invoke(null, args); What if you have a static method that takes no arguments? m.invoke(null,null); Limitations The class must be loadable I.E., you must have access to the byte codes Entire system works on byte code driven methods. This is not a source code driven mechanism Everything is already compiled. Class c = Class.forName(“ofijewoi”);//cnfe Using Reflection ReflectUtil ru = new ReflectUtil(o); MethodList is used to store all the methods and get information about them. Class c = o.getClass(); //supported for all objects. public static void main(String args[]) { java.util.Date date = new java.util.Date(); Class c = date.getClass(); MethodList ml = new MethodList(c); Method mutators[] = ml.getWriteMethods(); Method accessors[] = ml.getReadMethods(); System.out.println("here comes the mutations"); print(mutators); System.out.println("here goes the accessors"); print(accessors); } Annotation Annotation enables semantics to be included Annotation enables compile-time checking Semantics for Java Java Lacks Semantics Semantics is the study of meaning Double x; //what should x be? What is the range on x? Can x be zero? Can x be negative? How can I know? Boolean Range @Retention(RetentionPolicy.RUNTIME) public @interface BooleanRange { public boolean getValue(); public String getName(); } BooleanRange @BooleanRange( getValue = true, getName = "isVisible" ) public void setDumb(boolean dumb) { isDumb = dumb; } Colors @Retention(RetentionPolicy.RUNTIME) public @interface Colors { String getForeground(); String getBackground(); } Colors+Range @Colors( getForeground = "0x00FF00", getBackground = "0x8a2be2" ) @BooleanRange( getValue = true, getName = "isVisible" ) public void setDumb(boolean dumb) { isDumb = dumb; } Range @Retention(RetentionPolicy.RUNTIME) public @interface Range { public double getValue(); public double getMin(); public double getMax(); public double getIncrement(); public String getName(); } Range Example @Range( getValue = 50, getMin = 1, getMax = 100, getName = "Hello World", getIncrement = 1 ) public void setY(int y) { this.y = y; } RangeArray import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) public @interface RangeArray { public double getValue(); public double getMin(); public double getMax(); public double getIncrement(); public String []getNames(); } Example RangeArray @RangeArray( getMin = 0, getMax = 1, getValue = 0, getNames = { "redMin", "redMax", "blueMin", "blueMax", "greenMin", "greenMax" }, getIncrement = 0.01 ) public void setCornerPoints(float[] cornerPoints) { this.cornerPoints = cornerPoints; } SpinnerProperties @Retention(RetentionPolicy.RUNTIME) public @interface SpinnerProperties { public boolean isVisible(); public boolean isCompact(); public boolean isIncrementHidden(); } SpinnerProperties Example @SpinnerProperties( isVisible = true, isCompact = false, isIncrementHidden = false ) public void setZ(double z) { this.z = z; } Text Annotation @Retention(RetentionPolicy.RUNTIME) public @interface TextProperties { public abstract String getDisplayName(); public abstract int getDefaultSize(); } Text Annotation Example @TextProperties( getDisplayName="{rho}", getDefaultSize=12 ) public void setRho(int y) { this.y = y; }