Download 24reflection

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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;
}