您的位置:首页 > 编程语言 > Java开发

java反射、内省、注解

2016-02-16 10:28 495 查看
最近在学习java反射,简单做下笔记。

反射的核心是类的class对象,取到这个class对象后,可以通过这个class对象的一系列方法去操作当前的java类

内省是jdk1.5提供的一套API以方便对javabean进行处理,这里只说PropertyDescriptor类,一个简单的例子

最后,注解的简单定义及使用例子

代码目录结构如下:



Person类的代码如下:

package com.bean;

public class Person {
private String name;
private int age;
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;
}
public void print(){
System.out.println("name:"+this.getName()+",age:"+this.getAge());
}
}


2个属性,相应的getter/setter方法,一个print函数

fangzai.properties文件内容如下:

className=com.bean.Person


读取这个配置文件获取到Person类路径,然后通过反射操作Person类

DefAnnotation代码如下:

package com.test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//定义此注解时,必须加上Retention注解(默认保留到class阶段),意思此注解保留到运行阶段有效
//否则ReflectTest.class.isAnnotationPresent(DefAnnotation.class)将为false
@Retention(RetentionPolicy.RUNTIME)
public @interface DefAnnotation {
String name() default "erchun";
int age();
}


可以看到,注解定义的格式类似接口的定义。注解使用时的属性在定义时是以方法的形式定义的,调用这些方法的返回值将是使用注解时设置的那些属性值,具体见代码运行结果

ReflectTest类代码如下:

package com.test;

import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
import com.bean.Person;
@DefAnnotation(name="erlei",age=19)
public class ReflectTest {

public static void main(String[] args) throws Exception{
//读取配置文件
//调用类的class对象的getResourceAsStream方法,该方法返回InputStream对象
InputStream is = ReflectTest.class.getResourceAsStream("/fangzai.properties");
Properties pros = new Properties();
pros.load(is);//从is输入流中读取属性列表(键值对)
is.close();
String className = pros.getProperty("className");

//通过反射取到Person对象
Person p1 = (Person)Class.forName(className).newInstance();
p1.setName("kobe");
p1.setAge(37);
p1.print();

//java内省操作-->jdk对javabean操作的一套API
//为p1对象的name属性构造一个PropertyDescriptor
PropertyDescriptor pd = new PropertyDescriptor("name",p1.getClass());
//获取name属性的写方法,即setName方法
Method msetName = pd.getWriteMethod();
//调用p1的setName方法
msetName.invoke(p1, "james");
p1.print();

//注解
if(ReflectTest.class.isAnnotationPresent(DefAnnotation.class)){
DefAnnotation da = (DefAnnotation)ReflectTest.class.getAnnotation(DefAnnotation.class);
System.out.println(da.name()+","+da.age());
}

}
}


运行结果:

name:kobe,age:37
name:james,age:37
erlei,19


OK,比较简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdk java api