Java反射机制
2016-09-21 10:08
316 查看
一、Overview
Java反射机制是其独有的一种高级动态用法,这个机制可以取得任意一个已知名字的class对象的内部信息,包括其内部的method,field,superclass,interfaces。换句话说,程序在编译的时候根本不知道对应class的任何内部信息,但是在运行的时候可以加载,并获得其结构。二、使用方法(Demo)
2.1 Class对象的获取方法
有三种方法可以获得对应类的Class对象public class Demo { public static void main(String[] args) { Class<?> clazz = null; /** * 1. 通过类名进行加载 */ clazz = Task.class; /** * 2. 通过类对象加载 */ Task task = new Task(); clazz = task.getClass(); /** * 3.通过完整的包名进行加载 */ try { clazz = Class.forName("com.test.mycode.Task"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class Task{ }
2.2 创建对象的实例
通过不同的构造函数实例化对象public class Demo { public static void main(String[] args) { Class<?> clazz = null; try { clazz = Class.forName("com.test.mycode.Task"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Task task1 = null; Task task2 = null; Task task3 = null; Task task4 = null; //注意得到的构造函数是按照声明的倒序进行排列的,赋值的时候注意 Constructor<?>[] cons = clazz.getConstructors(); try { task1 = (Task)cons[0].newInstance(123,"sff","sff",new Date()); task2 = (Task)cons[1].newInstance(123,"sff","sff"); task3 = (Task)cons[2].newInstance(123,"sff"); task4 = (Task)cons[3].newInstance(123); } catch (Exception e) { e.printStackTrace(); } System.out.println(task1); System.out.println(task2); System.out.println(task3); System.out.println(task4); } } class Task{ private int taskNo; private String taskName; private String others; private Date createTime; public Task(int taskNo) { this.taskNo = taskNo; } public Task(int taskNo, String taskName) { this.taskNo = taskNo; this.taskName = taskName; } public Task(int taskNo, String taskName, String others) { this.taskNo = taskNo; this.taskName = taskName; this.others = others; } public Task(int taskNo, String taskName, String others, Date createTime) { this.taskNo = taskNo; this.taskName = taskName; this.others = others; this.createTime = createTime; } @Override public String toString() { return "Task [taskNo=" + taskNo + ", taskName=" + taskName + ", others=" + others + ", createTime=" + createTime + "]"; } }
2.3 一些常用的方法
public class Demo { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchMethodException, SecurityException, InvocationTargetException { Class<?> clazz = null; try { clazz = Class.forName("com.test.mycode.Task"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } /** * 得到全部属性值 */ Field[] field = clazz.getDeclaredFields();//只得到当前类的属性 //field = clazz.getFields();//得到所有的属性(包括父类的和当前类的) for(int i=0;i<field.length;i++){ System.out.println(field[i].getName()); } /** * 设置属性值 */ field[3].set(Task.class, 245);//一般设置静态变量的值 Task task = (Task) clazz.newInstance(); System.out.println(task.No); /** * 得到方法值 */ Method[] method = clazz.getDeclaredMethods();//只得到当前类的方法 //method = clazz.getMethods();//得到所有的方法(包括父类的和当前类的) for(int i=0;i<method.length;i++){ System.out.println(method[i].getName()); } /** * 调用方法 */ Method method1 = clazz.getMethod("taskFun1",String.class); method1.invoke(clazz.newInstance(), "hello"); /** * 得到修饰符和属性类型 */ for(int i=0;i<field.length;i++){ //属性说明符 int m = field[i].getModifiers(); String priv = Modifier.toString(m); //属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); } } } class Task{ private int taskNo; private String others; private Date createTime; public static int No; public void taskFun1(String name){ System.out.println("taskFun1:"+name); } public void taskFun2(String name){ System.out.println("taskFun1:"+name); } public void taskFun3(String name){ System.out.println("taskFun1:"+name); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序