Java反射机制简介
来源:互联网 发布:腾讯qq微信红包数据 编辑:程序博客网 时间:2024/06/05 05:11
- Java反射机制的理解
- Java反射机制的概念
- Java反射机制的相关方法
- 在运行时获取一个类的Class对象
- 在运行时获取一个类所具有的成员变量
- 在运行时获取一个类所具有的方法
- 在运行时调用这个类的一个对象的方法
- 通过一个Demo加深理解
Java反射机制的理解
最近接手公司的项目中,经常用到Java的反射来动态的获取其他SDK的属性以及方法,因此抽时间写了一篇文章回顾一下Java反射的知识,温故知新。
Java反射机制的概念
首先先介绍一下反射的概念,反射的概念是主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
而体现在Java中,对于一个类,在程序运行的时候,可以通过已知的Class名称动态的创建这个类的实例、获取类的Fields、Method、Constructor。
即通过Java的反射机制,我们可以实现如下功能:
- 在运行时获取一个类的实例
- 在运行时判断一个对象所属的类
- 在运行时获取一个类所具有的成员变量和方法
- 在运行时调用这个类的一个对象的方法
Java反射机制的相关方法
1. 在运行时获取一个类的Class对象
2. 在运行时获取一个类所具有的成员变量
3. 在运行时获取一个类所具有的方法
4. 在运行时调用这个类的一个对象的方法
通过一个Demo加深理解
首先创建一个类CSDNInfo,该类声明2成员变量,一个public修饰的name,一个private的age;
声明如下方法:setAge,getAge,setName,getName,toString;
package com.cdsn.lhy;/** * @author linghuanyun * @Date 2016-9-5 */public class CSDNInfo { public String name; private String age; public CSDNInfo(String name, String age) { super(); this.name = name; this.age = age; } public CSDNInfo() { super(); // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "CSDNInfo [name=" + name + ", age=" + age + "]"; }}
下面进行测试,直接贴出代码。
package com.cdsn.lhy;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * @author linghuanyun * @Date 2016-9-5 */public class ReflectionTest { public static void main(String[] args) { try { // 获得Class对象 Class<?> clazz = Class.forName("com.cdsn.lhy.CSDNInfo"); // 获得类的实例 CSDNInfo instance = (CSDNInfo) clazz.newInstance(); /** * getFields(),只包含当前类以及父类public字段 */ Field[] fields = clazz.getFields(); System.out.println("getting all fields......"); for (Field field : fields) { System.out.println(field); } /** * getDeclaredFields(),不包括父类字段 */ Field[] declaredFields = clazz.getDeclaredFields(); System.out.println("\ngetting all declaredFields......"); for (Field field : declaredFields) { System.out.println(field); } /** * getMethods(),只包含当前类以及父类(Object)public方法 */ Method[] methods = clazz.getMethods(); System.out.println("\ngetting all methods........"); for (Method method : methods) { System.out.print(method.getName() + " "); } /** * getDeclaredMethods(),不包括父类方法 */ Method[] declareMethods = clazz.getDeclaredMethods(); System.out.println("\ngetting all declaredMethods........"); for (Method method : declareMethods) { System.out.print(method.getName() + " "); } /** * invoke() */ System.out.println("\ngetting invoke........."); Method setName = clazz.getMethod("setName", new Class[] { String.class }); Method setAge = clazz.getMethod("setAge", new Class[] { String.class }); Method toString = clazz.getMethod("toString", new Class[] {}); System.out.println("before invoking setAge and setName" + (String) instance.toString()); setAge.invoke(instance, "18"); setName.invoke(instance, "linghuanyun"); System.out.println("after invoking setAge and setName" + (String) instance.toString()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
运行结果如下图所示:
结果分析:
- 可以看到在执行getFields(),获得了public声明的name字段,而private声明的age则没有;而getDeclaredFields()方法将这个类声明的name以及age都获取到了。
- 执行getMethods(),除了类本身声明的几个方法,还拿到了继承自Object类的public方法,如wait(),equals()等等。
- 执行invoke前,instance对象的name以及age并没有赋值,所以都为null,在invoke了setName()以及setAge()方法后,可以看到已经成功赋值。
稍后附上演示Demo下载地址,欢迎大家交流讨论。
下载地址:演示Demo,欢迎点击下载
1 0
- java 反射机制简介
- Java反射机制简介
- java反射机制简介
- Java反射机制简介 .
- java反射机制简介
- java反射机制简介
- 简介java反射机制
- Java反射机制简介
- Java反射机制简介
- Java反射机制的简介
- Java反射基础机制简介
- Java中反射机制简介
- Java提高 - Java反射机制简介
- JAVA的反射机制简介(上)
- JAVA的反射机制简介(下)
- Java反射机制--基本使用方法简介
- Java反射机制简介及简单实例
- .NET反射机制简介
- linux下安装PostgreSQL数据库
- CSS经典布局之双飞翼布局
- 跨域请求
- MFC RADIO
- Python抓取图片(贴吧)
- Java反射机制简介
- adb命令使用总结
- C#基础之计算器的简单实现
- 聊聊java的toString
- Git 中 tag 的用法(打tag、删除tag等)
- JAVA读取文件方法大全
- Shiro整合spring
- 获取EXTJS中的FormPanel的所有控件值和属性
- html+css选项卡tab形式的用户注册特效,效果不错