`
hulianwang2014
  • 浏览: 726178 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

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;

}


分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java面试题--反射机制

    Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制提供了以下功能: 1. **获取类的信息**:可以在运行时获取类的修饰符、父类、实现接口等信息。 2. **操作...

    Java反射机制 Java反射机制

    ### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。

    JAVA反射机制应用

    JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    Java反射机制的实现_Reflection

    Java反射机制还涉及到注解处理,可以使用`Annotation`接口及其子类来获取和处理类、方法、字段上的注解信息。这对于实现元编程、AOP(面向切面编程)和自定义注解处理器非常有用。 总的来说,Java反射机制为程序员...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java反射机制.md

    深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破

Global site tag (gtag.js) - Google Analytics