反射
来源:互联网 发布:互联网中文域名 编辑:程序博客网 时间:2024/05/29 03:54
一、反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
二、通过反射获取构造方法并使用
1、获取构造方法
getConstructors ××获取的public的构造方法
getDeclaredConstructors ××获取所有构造方法
2、创建对象
newInstance()
con.newInstance(“zhangsan", 20);
三、通过反射获取成员变量并使用
1、获取所有成员
getFields,getDeclaredFields
2、获取单个成员
getField,getDeclaredField
3、修改成员的值
set(Object obj,Object value)
将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
四、通过反射获取成员方法并使用
1、获取所有方法
getMethods
getDeclaredMethods
2、获取单个方法
getMethod
getDeclaredMethod
3、暴力访问
method.setAccessible(true);
五、反射应用举例
1、通过配置文件运行类中的方法
我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
public class ArrayListDemo {public static void main(String[] args) throws NoSuchMethodException,SecurityException, IllegalAccessException,IllegalArgumentException, InvocationTargetException {// 创建集合对象ArrayList<Integer> array = new ArrayList<Integer>(); // array.add("hello");// array.add(10); Class c = array.getClass(); // 集合ArrayList的class文件对象Method m = c.getMethod("add", Object.class); m.invoke(array, "hello"); // 调用array的add方法,传入的值是hellom.invoke(array, "world");m.invoke(array, "java"); System.out.println(array);}}
2、写一个方法,
public void setProperty(Object obj, String propertyName, Object value){},
此方法可将obj对象中名为propertyName的属性的值设置为value。
Tool.classpublic class Tool {public void setProperty(Object obj, String propertyName, Object value)throws NoSuchFieldException, SecurityException,IllegalArgumentException, IllegalAccessException {// 根据对象获取字节码文件对象Class c = obj.getClass();// 获取该对象的propertyName成员变量Field field = c.getDeclaredField(propertyName);// 取消访问检查field.setAccessible(true);// 给对象的成员变量赋值为指定的值field.set(obj, value);}}ToolTest.classpublic class ToolTest{public static void main(String[] args) throws NoSuchFieldException,SecurityException, IllegalArgumentException, IllegalAccessException {Person p = new Person();Tool t = new Tool();t.setProperty(p, "name", "lfsenior");t.setProperty(p, "age", 20);System.out.println(p);}}
阅读全文
1 0
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 工业自动化的发展趋势
- 如何清理myeclipse自带的tomcat的缓存
- Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿)
- 无法定位程序输入点strnlen于动态链接库msvcrt.dll上(Qt XP)
- 【笔记】Hadoop-HA集群搭建
- 反射
- 老毛桃一键还原软件超强发布
- u3d The referenced script on this Behaviour is missing
- css中position属性(absolute|relative|static|fixed)详解
- Win7不激活会怎么样 Win7可以不用激活吗
- 一句话阐述Haskell基本概念---个人翻译
- php运算符
- 《Unix环境高级编程》读书笔记:文件和目录
- Cubieboard Linux 搭建VNC(验证过 xfce4 桌面)