java反射、内省、注解
2016-02-16 10:28
495 查看
最近在学习java反射,简单做下笔记。
反射的核心是类的class对象,取到这个class对象后,可以通过这个class对象的一系列方法去操作当前的java类
内省是jdk1.5提供的一套API以方便对javabean进行处理,这里只说PropertyDescriptor类,一个简单的例子
最后,注解的简单定义及使用例子
代码目录结构如下:
![](https://img-blog.csdn.net/20160216100004240)
Person类的代码如下:
2个属性,相应的getter/setter方法,一个print函数
fangzai.properties文件内容如下:
读取这个配置文件获取到Person类路径,然后通过反射操作Person类
DefAnnotation代码如下:
可以看到,注解定义的格式类似接口的定义。注解使用时的属性在定义时是以方法的形式定义的,调用这些方法的返回值将是使用注解时设置的那些属性值,具体见代码运行结果
ReflectTest类代码如下:
运行结果:
OK,比较简单。
反射的核心是类的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,比较简单。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Manifest 用法
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 什么是 GraphQL?
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Spark RDD API详解(一) Map和Reduce
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序