java反射、内省、注解

来源:互联网 发布:短网址源码 编辑:程序博客网 时间:2024/05/22 13:52

最近在学习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:37name:james,age:37erlei,19

OK,比较简单。

0 0
原创粉丝点击