- 浏览: 5176170 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29443
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操作程序的内部属性。例如,使用 它能获得 Java 类中各成员的名称并显示出来。
Java 反射机制主要提供了以下功能:
a .在运行时判断任意一个对象所属的类。
b .在运行时构造任意一个类的对象。
c .在运行时判断任意一个类所具有的成员变量和方法。
d .在运行时调用任意一个对象的方法。
在 JDK 中,主要由以下类来实现 Java 反射机制,这些类在 java.lang.reflect 包中:
Class 类:代表一个类。
Field 类:代表类的成员变量(成员变量也 称为类的属性)。
Method 类:代表类的方法。
Constructor 类:代表类的构造方法。
Array
类:提供了动态创建数组,以及访问数组的元素的静态方法。
下面写了一个程序:设计了一个
POJO
类。所谓
POJO
类,本人粗浅的理解即和
JavaBean
类似,只有字段和
setter/getter
方法。然后在主函数通过反射,在控制台打印该
POJO
类的所有字段和方法。
本人设计的
POJO
类为
WorkerPOJO.java
,然后另一个测试类为
POJOReflection.java
,在
main
函数中负责打印该类的所有字段和方法。程序见下:
WorkerPOJO.java
:
package
com.xpec.landon.trainjava.annotation;
/**
* POJO类,和JavaBean相似
* @author lvwenyong
*
*/
public class WorkerPOJO{
private String name;
private int age;
/**
* 用Annotation修饰
* @return 姓名
*/
@WorkerPOJOAnnotation(name =
"landon",age = 22)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
POJOReflection.java
:
package
com.xpec.landon.trainjava.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Method;
/**
* 运用Java的反射机制,输出POJO类的字段和方法(新增了Annotation的修饰)
* @author lvwenyong
*
*/
public class POJOReflectionTest {
public static void main(String[] args)
{
try
{
//加载WorkPOJO,注意这里一定要写全类名,包括包名,因为包名是类名的一部分
Class pojo =
Class.forName("com.xpec.landon.trainjava.annotation.WorkerPOJO");
//获取域的数组
Field []fieldList = pojo.getDeclaredFields();
//获取方法的数组
Method []methodList = pojo.getDeclaredMethods();
System.out.println("WorkerPOJO类的所有字段:");
System.out.println("修饰符" + " " + "类型" + " " +
"字段名");
for(int i = 0;i < fieldList.length;i++)
{
Field field = fieldList[i];
//用下面的形式获取具体的修饰符
System.out.println(Modifier.toString(field.getModifiers()) + " " +
field.getType() + " " + field.getName());
}
System.out.println();
System.out.println("WorkerPOJO类的所有方法(不包括annotation修饰的方法):");
for(int j = 0;j < methodList.length;j++)
{
Method method = methodList[j];
//判断方法是否被Annotation修饰
boolean methodAnnotation =
method.isAnnotationPresent(WorkerPOJOAnnotation.class);
//如果被annotation修饰,则过滤掉该方法,即不输出
if(methodAnnotation)
{
continue;
}
//获取方法参数列表
Class parameters[] = method.getParameterTypes();
System.out.print(Modifier.toString(method.getModifiers()) + " " +
method.getReturnType() + " " + method.getName() + " (");
for(int k = 0;k < parameters.length;k++)
{
System.out.print(parameters[k].toString());
}
System.out.println(")");
}
}
catch(ClassNotFoundException exception1)
{
exception1.printStackTrace();
}
}
}
下面是程序的一个运行截图:
可以看到,在WorkerPOJO类中引入了Annotation
。
下面,我们详细介绍一下Annotation:
在使用
JUnit4
中,我们可以看到在每个测试方法前面都有一个
@Test
标记,这就是传说中的
Annotation
。
Annotation
提供了一条与程序元素关联任何信息或者任何元数据(
metadata
)的途径。从某些方面看,
annotation
就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成
员变量、参数、本地变量的声明中。这些信息被存储在
annotation
的
“name=value”
结构对中。
annotation
类型是一种接
口,能够通过
java
反射
API
的方式提供对其信息的访问。
annotation
能被用来为某个程序元素(类、方法、成员变量等)关联任何的信
息。需要注意的是,这里存在着一个基本的潜规则:
annotaion
不能影响程序代码的执行,无论增加、删除
annotation
,代码都始终如一的执行。另外,尽管一些
annotation
通
过
java
的反射
api
方法在运行时被访问,而
java
语言解释器在工作时忽略了这些
annotation
。正是由于
java
虚拟机忽略了
annotation
,导致了
annotation
类型在代码中是
“
不起作用
”
的;只有通过某种配套的工具才会对
annotation
类型中的信息进行访问和处理。
annotation
是与一个程序元素相关联信息或者元数据的标注。它从不影响
ava
程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产
生影响。
我的理解是:
Annotation
是继承自
java.lang.annotation.Annotation
的类,用于向程序分析工具或虚拟机提供
package class field methed
等方面的信息,它和其他类没什么区别
,
除了使用方式。
下面写了一个简单的Annotation:WorkerPOJOAnnotation.java
package
com.xpec.landon.trainjava.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 修饰WorkerPOJO类方法的一个Annotation
* @author lvwenyong
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WorkerPOJOAnnotation {
String name();
int age();
}
其
中
@Target
里面的
ElementType
是用来指定
Annotation
类型可以用在哪一些元素上的,包括
TYPE
(类型),
METHOD
(方法),
FIELD
(字段),
PARAMETER
(参数)等。其中
TYPE
是指可以用在
Class,Interface
等类型上。下面给出用
jad
反编译
出的
ElementType
中的静态变量的截图:
另外
@Retention
中的
RetentionPolicy
是指
Annotation
中的信息保留方式,
分别是
SOURCE,CLASS
和
RUNTIME.
SOURCE
代表的是这个
Annotation
类型的信息只会保留在程序源码里,源码如果经过了编译之后,
Annotation
的数据就会消失
,
并不会保留在编译好的
.class
文件里面。
ClASS
的意思是这个
Annotation
类型的信息保留在程序源码里
,
同时也会保留在编译好的
.class
文件里面
,
在执行的时候,并不会把这一些信息加载到虚拟机
(JVM)
中去
.
注意一下,当你没有设定一个
Annotation
类型的
Retention
值时,系统默认值是
CLASS.
第三个
,
是
RUNTIME,
表示在源码、编译好的
.class
文件中保留信息,在执行的时候会把这一些信息加载到
JVM
中去的.
下面给出用
jad
反编译出的
RetentionPolicy
中的静态变量的截图
最后的一个
Annotation@Documented
是指目的就是让这一个
Annotation
类型的信息能够显示在
Java
API
说明文档上。
下面将上面自己设计的
WorkerPOJOAnnotation
应用在了
WorkerPOJO
类的一个方法前面:
然后在控制台输出了没有被
Annotation
注释的字段和方法,运行后可以看到不包括
getName
方法。
最后我们可以用Junit4
书写一个测试用例: POJOReflectionJunit4Test
.java
package
com.xpec.landon.trainjava.annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.activation.FileDataSource;
import junit.framework.Assert;
import
org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* 关于Java反射以及Annotation的一个TestCase
* @author lvwenyong
*
*/
public class
POJOReflectionJunit4Test {
private Class pojo;
private Field []fieldList;
private Method[] methodList;
@Before
public void setUp() throws Exception {
//加载类WorkPOJO
pojo =
Class.forName("com.xpec.landon.trainjava.annotation.WorkerPOJO");
//获取域的数组
fieldList = pojo.getDeclaredFields();
//获取方法的数组
methodList = pojo.getDeclaredMethods();
}
//测试字段和方法的个数
@Test
public void testSize()
{
Assert.assertEquals(2, fieldList.length);
Assert.assertEquals(4, methodList.length);
}
//测试字段是否带有annotations
@Test
public void isFieldAnnotation()
{
for(int i = 0;i < fieldList.length;i++)
{
Assert.assertEquals(false,
fieldList[i].isAnnotationPresent(WorkerPOJOAnnotation.class));
}
}
//测试方法是否带有annotations
@Test
public void isMethodAnnotation()
{
for(int i = 0;i < methodList.length;i++)
{
Assert.assertEquals(false,
methodList[i].isAnnotationPresent(WorkerPOJOAnnotation.class));
}
}
@After
public void tearDown() throws Exception {
}
}
评论
发表评论
-
Java NIO与IO的详细区别(通俗篇)
2014-01-02 10:51 69476内核空间、用户空间 ... -
Java EE 单元测试
2013-09-12 10:56 4810觉得测试 Java EE 应用程序太困难、不方便或者太复杂? ... -
JUnit 测试建议
2013-07-22 09:04 3495以下是对JUnit实践的一 ... -
老生常谈:面试算法有必要吗?
2013-04-01 09:55 32796声明:虽然发表在愚人节,但是文章内容很严肃。 前几天在知 ... -
一步步开发 Spring MVC 应用
2013-02-23 10:53 10395Spring MVC 框架 Spring 框 ... -
「译」Java集合框架系列教程四:Set接口
2013-01-18 13:20 2545原文:The Set Interface 译文:Java集 ... -
「译」Java集合框架系列教程三:Collection接口
2013-01-18 13:16 2392原文:The Collection Interface 译 ... -
「译」Java集合框架系列教程二:集合接口
2013-01-18 13:13 2029原文:http://docs.oracle.c ... -
Java集合框架系列教程一:集合框架简介
2013-01-18 12:47 3041原文:http://docs.oracle.com/jav ... -
Java泛型-类型擦除
2012-12-05 15:48 14647一、概述 Java泛型在使用过程有诸多的 ... -
千万不要把 bool 当成函数参数
2012-11-16 08:33 12539我们有很多 Coding Style 或 代码规范。 但这一条 ... -
网站建设中关于eclipse启动参数的优化
2012-08-23 09:23 2520在网站建设中,经常用 ... -
Eclipse程序员要掌握的常用快捷键
2012-08-22 09:33 10084判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键 ... -
java中equals和==的区别
2012-08-15 16:31 2050值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在 ... -
名词王国里的死刑(翻译) - A Story of Hello World
2012-07-23 10:43 11824翻译自Steve Yegge的大 ... -
好代码是廉价的代码
2012-07-19 08:03 3304长久以来我一直主张:好代码是廉价的代码。 当我跟做开发 ... -
只要一个返回语句
2012-05-18 13:18 1829别再这样写了: publ ... -
java编程的78条黄金法则
2012-05-16 12:57 2375创建和销毁对象 1、考虑用静态工厂方法(返回类的实例的 ... -
for 循环为何可恨?
2012-05-15 12:44 1634Java的闭包(Closure)特征最近成为了一个热门话 ... -
Java 8 新功能
2012-05-02 08:48 1916我们已经急不可待想知道Java 8可用的新功能,其中大部 ...
相关推荐
Java反射机制还涉及到注解处理,可以使用`Annotation`接口及其子类来获取和处理类、方法、字段上的注解信息。这对于实现元编程、AOP(面向切面编程)和自定义注解处理器非常有用。 总的来说,Java反射机制为程序员...
在本资料"java反射机制文档及代码"中,详细介绍了Java反射的基础知识和常见应用。 首先,反射的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的名称、包名、属性、构造器、...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这为实现元编程和框架设计...
Java反射机制是Java编程语言中一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们...
接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...
Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和方法。这种机制使得代码具有高度的灵活性和动态性,能够在执行过程中根据需要动态地发现和调用类的方法,创建对象,...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制的核心在于`java.lang.reflect`包中的类和接口,如Class、Constructor、Method和Field。通过反射,...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于类名、方法名、参数类型等。这一机制的核心在于Class类,它代表了Java运行时的类信息。通过...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括获取类的信息、创建对象、调用方法以及访问和...
总的来说,通过Java的注解和反射机制,我们可以构建出一个高度抽象且具有通用性的数据库访问接口,它能够适应各种不同的数据模型,极大地提高了代码的灵活性和可维护性。同时,理解Android应用的基本结构,如...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这个机制的核心在于`java.lang.reflect`包中的类,如Class、Constructor、Method和Field。在Java中,反射...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和字段。通过反射,开发者可以实现动态类型检查、元编程、插件系统等功能,大大增强了代码的灵活性和可扩展...
以下是对Java反射机制应用实例的详细解释: 1. **获取类信息**:使用`Class`类的`forName()`方法可以获取到任何类的`Class`对象,例如`Class<?> clazz = Class.forName("全限定类名");`。这样我们就能获取到该类的...
"Java 反射机制详解" Java 反射机制是在运⾏状态中,对于任意⼀个类,都能够知道这个类的所有属性和⽅法;对于任意⼀个对象,都能够调⽤它的任意⼀个⽅法和属性;这种动态获取的信息以及动态调⽤对象的⽅法的功能...
Java反射机制是Java语言的一个重要特性,它允许运行时的Java程序访问并操作类和对象的信息,甚至可以改变对象的行为。这一机制使得Java具有了高度的动态性,开发者可以通过字符串来调用方法、创建对象、获取类信息...