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.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;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值