Java 反射机制(上)

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.2ClassName

获取类名,可以使用如下方法。

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.3Modifier(修饰符)

你可以通过类对象获取一个累的修饰符,类修饰符就是这些关键字” 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.5Superclass

你可以通过Class对象访问超类,实现如下。

Class superclass = SomeClass.getSuperclass();

1.6Implemented Interfaces

可以通过此类获取一系列它的实现类。

ClassSomeClass = ... //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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值