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反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制提供了以下功能: 1. **获取类的信息**:可以在运行时获取类的修饰符、父类、实现接口等信息。 2. **操作...
### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
java反射机制源码java反射机制源码java反射机制源码
Java反射机制还涉及到注解处理,可以使用`Annotation`接口及其子类来获取和处理类、方法、字段上的注解信息。这对于实现元编程、AOP(面向切面编程)和自定义注解处理器非常有用。 总的来说,Java反射机制为程序员...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破