`

lang.reflect->java.lang.reflect.Field

阅读更多
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.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    java反射 反编译:.class--&gt;.java

    例如,`java.lang.Class`类提供了获取类信息的方法,`java.lang.reflect.Field`用于访问字段,`java.lang.reflect.Method`用于调用方法,而`java.lang.reflect.Constructor`则用于操作构造器。 获取类的三种方式:...

    commons-lang3-3.1jar:org.apache.commons.lang3.StringUtils等.

    Apache Commons Lang 是一个Java工具包,它提供了对Java核心库的补充,特别是在字符串处理、反射、日期和时间操作等方面。`commons-lang3-3.1.jar`是这个库的一个版本,其中包含了多个实用类和方法,有助于简化和...

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    4.反射-introdute.doc

    3. **Field类**:`java.lang.reflect.Field`表示类的成员变量,可以用来获取或设置类的字段值。例如: ```java Field field = classType.getDeclaredField("fieldName"); field.setAccessible(true); field.get...

    java 反射例子 代码

    java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;

    java Reflection 反射机制 反编译

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

    ExcelExportUtils.java

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

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    其中最经常使用的是三个类:java.lang.reflect.Field类、java.lang.reflect.Method类和java.lang.reflect.Constructor类。 Java.lang.reflect.Field类提供了有关类或接口的单个域的信息。利用这个类,我们可以得到...

    Java EE:Reflect 反射技术.docx

    - `java.lang.reflect.Field`:表示类的成员变量,用于获取和设置字段值。 - `java.lang.reflect.Constructor`:表示类的构造函数,用于创建类的新实例。 3. 获取Class对象的途径: - 通过类名获取:`类名.class` -...

    java面试题--反射机制

    - `java.lang.reflect.Field`:表示类的字段。 - `java.lang.reflect.Constructor`:表示类的构造器。 #### 五、`java.lang.Class`详解 `Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`...

    javassist3.19GA.jar

    用以执行和JDK反射API中java.lang.Class,,java.lang.reflect.Method,, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能...

    【Java基础笔记】反射.docx

    在Java中,反射主要涉及到`java.lang.Class`、`java.lang.reflect.Method`、`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。下面将详细介绍这些知识点。 1. **反射的概述** 反射机制使得Java...

    java的类反射

    反射的核心类包括`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`。下面将详细阐述这些核心类以及反射的主要用法。 1. `java.lang.Class`:每个类在...

    什么是java中的反射机制(reflect).docx

    Class 类代表了 Java 中的一个类,而 java.lang.reflect 包提供了许多反射类,例如 Constructor、Method、Field 等。 Constructor 类代表了某个类中的一个构造方法。例如,我们可以使用 Class.forName("java.lang....

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    - `java.lang.reflect.Field`: 提供类字段的反射信息。 - `java.lang.reflect.Method`: 提供类方法的反射信息。 - `java.lang.reflect.Modifier`: 提供关于访问权限的静态方法。 3.2.4 **使用反射机制的步骤** 1. ...

    java反射机制[参照].pdf

    反射机制的核心在于Java Reflection API,其中包括`java.lang.Class`,`java.lang.reflect.Method`,`java.lang.reflect.Field`和`java.lang.reflect.Constructor`等类。 首先,`java.lang.Class`是所有Java类的元...

    Java语言的动态属性总结[参考].pdf

    2. **Java.lang.reflect.AccessibleObject**: `Field`, `Method`, 和 `Constructor` 类的基类,提供了访问控制的机制,如设置访问权限以允许反射操作。 3. **Java.lang.reflect.Method**: 代表类的方法信息,包括...

    Java 反射机制详解及实例

    * 反编译:.class--&gt;Java * 通过反射机制访问 Java 对象的属性、方法、构造方法等 三、 Java 中的反射机制类 Java 中提供了多种反射机制类,例如: * java.lang.Class * java.lang.reflect.Constructor * java....

    Java软件开发实战 Java基础与案例开发详解 15-1 反射 共13页.pdf

    - `java.lang.reflect.Field`: 封装类的属性信息的类,可以是静态属性或实例属性。 - `java.lang.reflect.Constructor`: 封装类的某个构造方法信息的类。 - `java.lang.reflect.Method`: 封装类或接口上的某个方法的...

Global site tag (gtag.js) - Google Analytics