1.1Class Object
在运行时,使用Java反射可以侦测Java classes。当我们使用Java反射时,头一件事就是检测 classes。所有Java中主要类型(int,long, float etc.)都有一个关联的Class 对象。在编译的时候,如果你知道这个类的名字,你能够获取这个Class像这样:
Class myObjectClass = SomeObject.class
如果只知道类的字符串名称,可以这样获取:
String className =Class.forName(fullClassName);
必须提供给Class.forName()完全的class修饰名称。比如,这个SomeClass在包com.mycompany.myclass下,完整的名称fullClassName=”com.mycompany.mycl-
ass.SomeClass” 。当类路径下没有发现这个类时,会抛出 ClassNotFoundException
。
1.2 ClassName
获取类名,可以使用如下方法。
Class SomeClass =... //obtain Class object. See prev. section
String fullClassName= SomeClass.getName();//obtain the full class name.
StringsimpleClassName = SomeClass.getSimpleName();//only the class name.
1.3 Modifier(修饰符)
你可以通过类对象获取一个累的修饰符,类修饰符就是这些关键字” public”, “private”, “static” 等。使用如下方法获取:
Class SomeClass = ... //obtain Class object. Seeprev. section
int modifiers = SomeClass.getModifiers();
每个Modifer就是一个标志位,这个标志位要么被设置,要么被清除。这些Modifiers包装到这个int值中。You can check the modifiers using these methods in 在这个class包java.lang.reflect.Modifier下,你能够使用下列这些方法去核查modifers 。
1.4
Package info
获取包信息:Packagepackage = SomeClass.getPackage();也可以获取更多的package信息,参考package。
1.5 Superclass
你可以通过Class对象访问超类,实现如下。
Class superclass = SomeClass.getSuperclass();
1.6 Implemented Interfaces
可以通过此类获取一系列它的实现类。
Class SomeClass = ... //obtain Class object. See prev. section
Class[] interfaces = SomeClass.getInterfaces();
注意:如果这个类implements了超类,但是没有具体指定对应它实现类的状态,那个接口interface也不会包含在返回的列表中。
还可以获取的信息如下所示。
Constructor[]constructors = aClass.getConstructors();
Method[] method =aClass.getMethods();
Field[] method =aClass.getFields();
Annotation[]annotations = aClass.getAnnotations();
2 Constructors
在运行时刻,使用Java 反射可以侦测类的构造器并且实例化它,这是通过java.lang.reflect.Constructor来实现这些操作。
Constructor[]constructors = SomeClass.getConstructors();
如果你精确地知道你能够访问应构造器的参数类型,你可以直接获取到。
Constructorconstructor =SomeClass.getConstructor(new Class[]{String.class});//Stringparams
有关contructors的相关信息,可以通过如下方法获取。
Constructor constructor = ... // obtainconstructor - see above
Class[]parameterTypes = constructor.getParameterTypes();
//get constructorthat takes a String as argument
Constructorconstructor = MyObject.class.getConstructor(String.class);
//initialize theclass by providing the specified parameter.
MyObject myObject = (MyObject)
constructor.newInstance("constructor-arg1");
3 Fields
在运行时刻,使用Java 反射可以侦测类的field(成员变量)并且get/set对应的值,这是通过java.lang.reflect.Field来实现这些操作。
Class SomeClass =...//obtain class object
Field[] methods = SomeClass.getFields();//obtainthe fields list
Field field = SomeClass.getField("someField");//specifythe some field
String fieldName =field.getName(); //obtain the field name
Object fieldType =field.getType(); //obtain the fieldtype
一旦你获取了一个field引用,你就可以通过Field.get() 和 Field.set()方法来get/set它的值。
Class SomeClass = MyObject.class
Field field = SomeClass.getField("someField");
MyObjectobjectInstance = new MyObject();
Object value =field.get(objectInstance);
field.set(objetInstance,value);
4 Methods
在运行时刻,使用Java 反射可以侦测类的方法并且调用它们,这是通过java.lang.reflect.Method来实现这些操作。
Method[] methods = SomeClass.getMethods();
Method method =SomeClass.getMethod("doSomething", //method name
newClass[]{String.class});
如果这个方法没有参数,你可以传入null。
Method method =
aClass.getMethod("doSomething",null);
你也可以从一个method中获取对应参数列表。
Class[] parameterTypes =method.getParameterTypes();
Class returnType =method.getReturnType(); //obtain the return type.
像这样调用方法:
//get method that takes a String as argument
Method method =MyObject.class.getMethod("doSomething", String.class);
Object returnValue =method.invoke(null, "parameter-value1");
这个null参数是这个方法的调用类对象,如果这个方法是static,你可以提供null参数。反之,你必须提供对应的对象实例。
5 Getters and Setters
首先,让我们看看getters 和setters方法的规则:
- Getter
名字开始以“get”开头,0个参数,有一个返回值。 - Setter
名字开始以“set”开头,1个参数。
更具方法的相关特性,可以定义获取方式如下。
publicstatic void printGettersSetters(Class aClass){
Method[] methods = aClass.getMethods();
for(Method method : methods){
if(isGetter(method))System.out.println("getter: " + method);
if(isSetter(method))System.out.println("setter: " + method);
}
}
publicstatic boolean isGetter(Method method){
if(!method.getName().startsWith("get")) return false;
if(method.getParameterTypes().length !=0) return false;
if(void.class.equals(method.getReturnType())return false;
return true;
}
publicstatic boolean isSetter(Method method){
if(!method.getName().startsWith("set")) return false;
if(method.getParameterTypes().length != 1)return false;
return true;
}