java 反射功能强大,也是很多基础框架的核心技术。结合jdk1.5 的注解功能java反射技术再很多项目中成了必备的技术。
本例子展现了java.lang.reflect.Field类的使用方法以及方法的含义。
从功能上划分Field反射功能包含:
1、与注解相关方法。声明在 AnnotatedElement 接口中:
public interface AnnotatedElement {
/**
判断当前Element 是否有annotationClass注解信息
*/
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
/**
返回当前element 对象的annotationClass 注解信息 没有annotationClass 注解信息会抛出异常
*/
<T extends Annotation> T getAnnotation(Class<T> annotationClass);
/**
返回当前Element 对象的所有注解信息
*/
Annotation[] getAnnotations();
/**
返回直接声明在当前Element对象的所有注解信息(一般在Method中使用)
*/
Annotation[] getDeclaredAnnotations();
}
2、Field 值的设置和获取信息。
public Object get(Object obj){...}
public boolean getBoolean(Object obj){...}
public void set(Object obj, Object value){...}
详细请参考jdk代码。(略)
3、Field 元信息。(名称、类型、泛型参数等)
public String getName() //返回field声明的名字
public Class<?> getType() //返回field声明的类型
public Type getGenericType()// 包含泛型的field声明的类型
public int getModifiers() //返回public、final 、static 等修饰符
综合例子:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE,ElementType.CONSTRUCTOR })
@interface Note {
public boolean require() default true;
public String note() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE,ElementType.CONSTRUCTOR })
@interface Type {
public boolean require() default true;
public String note() default "";
}
@Note(note= "calss->B",require = false)
class B {
@Note(note="field->note")
@Type(note="field->type")
public List<String> note = Arrays.asList("defaultValue");
@Note(note="CONSTRUCTOR->B")
public <T> B(@Note(note = "p->note") @Type(note = "p->type") String note,String note2){
}
@Note(note = "method ->login()",require = true)
public void login(@Note(note = "p->username") String username, @Note(note = "p->password")String password) {
}
@Note(note = "method ->login()",require = true)
public boolean loginUser(@Note(note = "p->username") String username, @Note(note = "p->password")String password) {
return true;
}
public List<String> getNote() {
return note;
}
public void setNote(List<String> note) {
this.note = note;
}
}
package array;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 字段反射
* @author xinchun.wang
*
*/
public class FieldReflect {
public static void main(String[] args) throws Exception {
//生成一个真实的B对象
B b = new B("testNote", "note2");
//获取B.class 的loginUser方法 注意参数:("loginUser", String.class,String.class)
Method loginMethod = B.class.getMethod("loginUser", String.class,String.class);
//获取声明loginMethod 所在Class对象 即:B.class
Class<?> type = (Class<?>) loginMethod.getDeclaringClass();
System.out.println("----------------begin getDeclaringClass------------------------");
System.out.println(type);
System.out.println(B.class);
System.out.println(type.equals(B.class)); //true
System.out.println(type == B.class); //true
System.out.println("----------------end getDeclaringClass------------------------");
System.out.println("----------------begin getField------------------------");
//获取一个成员变量 (field 必须为public)
Field field = B.class.getField("note");
System.out.println(field.getName()); //获取声明的note变量
System.out.println(field.isAccessible()); // false :默认 不优化处理。返回是否可以优化处理 (注意含义请阅读api)
field.setAccessible(true);
System.out.println("----------------end getField------------------------");
//获取b对象的常量
@SuppressWarnings("unchecked")
List<String> objField = (List<String>)field.get(b);
System.out.println(objField);
List<String> list = new ArrayList<String>();
list.add("goodBoy");
field.set(b, list);
objField = (List<String>)field.get(b);
System.out.println(objField);
//获取字段的所有注解信息
Annotation[] fieldAnno = field.getAnnotations();
for (Annotation anno : fieldAnno) {
if (anno instanceof Note) {
System.out.println(((Note) anno).note());
}
}
//获取某一个类型的注解
Note note = field.getAnnotation(Note.class);
System.out.println(note.note());
//获取包含泛型信息的字段类型信息
java.lang.reflect.Type refType = field.getGenericType();
System.out.println(refType);
//获取字段的参数类型
System.out.println("***************");
if(refType instanceof ParameterizedType){
ParameterizedType pType = (ParameterizedType)refType;
java.lang.reflect.Type[] types = pType.getActualTypeArguments();
System.out.println(Arrays.toString(types));
}
System.out.println("***************");
//获取字段的类型信息
System.out.println(field.getType());
//获取直接在字段上声明的注解信息
Annotation[] anno = field.getDeclaredAnnotations();
for(Annotation item :anno){
System.out.println( item);
}
}
}
运行结果:
----------------begin getDeclaringClass------------------------
class array.B
class array.B
true
true
----------------end getDeclaringClass------------------------
----------------begin getField------------------------
note
false
----------------end getField------------------------
[defaultValue]
[goodBoy]
field->note
field->note
java.util.List<java.lang.String>
***************
[class java.lang.String]
***************
interface java.util.List
@array.Note(require=true, note=field->note)
@array.Type(require=true, type=field->type)
分享到:
相关推荐
在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...
例如,`java.lang.Class`类提供了获取类信息的方法,`java.lang.reflect.Field`用于访问字段,`java.lang.reflect.Method`用于调用方法,而`java.lang.reflect.Constructor`则用于操作构造器。 获取类的三种方式:...
Apache Commons Lang 是一个Java工具包,它提供了对Java核心库的补充,特别是在字符串处理、反射、日期和时间操作等方面。`commons-lang3-3.1.jar`是这个库的一个版本,其中包含了多个实用类和方法,有助于简化和...
1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...
3. **Field类**:`java.lang.reflect.Field`表示类的成员变量,可以用来获取或设置类的字段值。例如: ```java Field field = classType.getDeclaredField("fieldName"); field.setAccessible(true); field.get...
3. **`java.lang.reflect.Field`**:表示类的成员变量。 4. **`java.lang.reflect.Method`**:表示类的方法。 5. **`java.lang.reflect.Modifier`**:提供对成员的修饰符的访问。 ##### 基本使用方法 1. **获取...
java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { ...
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; ...
其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field类提供了有关类或接口的单个域的信息。利用这个类,我们可以得到...
- `java.lang.reflect.Field`:表示类的成员变量,用于获取和设置字段值。 - `java.lang.reflect.Constructor`:表示类的构造函数,用于创建类的新实例。 3. 获取Class对象的途径: - 通过类名获取:`类名.class` -...
- `java.lang.reflect.Field`:表示类的字段。 - `java.lang.reflect.Constructor`:表示类的构造器。 #### 五、`java.lang.Class`详解 `Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`...
用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能...
在Java中,反射主要涉及到`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。下面将详细介绍这些知识点。 1. **反射的概述** 反射机制使得Java...
反射的核心类包括`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`。下面将详细阐述这些核心类以及反射的主要用法。 1. `java.lang.Class`:每个类在...
Class 类代表了 Java 中的一个类,而 java.lang.reflect 包提供了许多反射类,例如 Constructor、Method、Field 等。 Constructor 类代表了某个类中的一个构造方法。例如,我们可以使用 Class.forName("java.lang....
- `java.lang.reflect.Field`: 提供类字段的反射信息。 - `java.lang.reflect.Method`: 提供类方法的反射信息。 - `java.lang.reflect.Modifier`: 提供关于访问权限的静态方法。 3.2.4 **使用反射机制的步骤** 1. ...
反射机制的核心在于Java Reflection API,其中包括`java.lang.Class`,`java.lang.reflect.Method`,`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。 首先,`java.lang.Class`是所有Java类的元...
2. **Java.lang.reflect.AccessibleObject**: `Field`, `Method`, 和 `Constructor` 类的基类,提供了访问控制的机制,如设置访问权限以允许反射操作。 3. **Java.lang.reflect.Method**: 代表类的方法信息,包括...
* 反编译:.class-->Java * 通过反射机制访问 Java 对象的属性、方法、构造方法等 三、 Java 中的反射机制类 Java 中提供了多种反射机制类,例如: * java.lang.Class * java.lang.reflect.Constructor * java....