黑马程序员-Java中的反射
来源:互联网 发布:用源码搭建网站教程 编辑:程序博客网 时间:2024/04/28 08:33
JAVA中的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。
1、得到类的属性
public Object getProperty(Object owner, String fieldName) throws Exception { Class ownerClass = owner.getClass(); //得到对象的class Field field = ownerClass.getField(fieldName); //通过class得到类的属性 Object property = field.get(owner); //通过对象得到该属性的实例。 }
2、得到类的静态属性
public Object getStaticProperty(String className, String fieldName) throws Exception { Class ownerClass = Class.forName(className); Field field = ownerClass.getField(fieldName); //这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里可以得到 Object property = field.get(ownerClass); return property; }3、执行对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName,argsClass); //得到要执行的方法 return method.invoke(owner, args); }4、执行某个类的静态方法
public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception { Class ownerClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName,argsClass); return method.invoke(null, args); //因为是静态方法所以不需要实例 }5、新建对象
public Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Constructor cons = newoneClass.getConstructor(argsClass); return cons.newInstance(args); //创建对象 }
知识点总结:
反射的基石-->Class类
java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class对象保存的是某个类的字节码;
得到字节码的三种方式:
1、Class.forname("java.long.String")//反射所用到的获取字节码的方式
2、Object.getClass();
3、Object.class
同一个类的字节码在内存中只存在一份,类的不同的实例用同一份字节码
Class中的一些方法:
ifPrimitive();判断字节码是不是基本的类型
Integer.TYPE为包装类型的基本的字节码
int[].class.isArray();是不是一个数组类型的字节码
.getConstructors();构造方法的反射,返回的是一个Constructor对象数组
.getField("成员变量名")OR .getFields();成员变量的反射,获得的field不是对象上的变量而是类上的
.getMethod("方法的名字",参数类型Object.class);成员方法的反射(Method)
.newInstance();调用不带参数的构造方法
.getConstructor(Object.class);得到有相应参数类型的构造方法,返回的是一个Constructor对象(newInstance(new Object()))
总之,只要是在源程序中出现的类型,都有各自的Class实例对象
反射的定义:反射就是把Java类中的各种成分映射成相应的Java类。
0 0
- 黑马程序员-JAVA中的反射
- 黑马程序员--java中的反射。
- 黑马程序员---java中的反射
- 黑马程序员-Java中的反射
- 【黑马程序员】java中的反射机制
- 黑马程序员 java中的反射技术理解
- 黑马程序员—Java中的反射机制
- 黑马程序员——Java中的反射
- 黑马程序员——java中的反射
- 黑马程序员——java中的反射
- 黑马程序员——java中的反射
- 黑马程序员---java反射及反射中的疑惑
- 黑马程序员,黑马论坛 ------JAVA中的反射机制
- 黑马程序员--java 反射
- 黑马程序员--Java反射
- 黑马程序员-java-反射
- 黑马程序员--java反射
- 黑马程序员-Java反射
- J2EE 初识DetachedCriteria查询
- k-means & isodata 聚类方法
- Linux的TCP/IP协议栈阅读笔记
- mybatis延迟加载
- Linux内核代码笔记2----内存寻址
- 黑马程序员-Java中的反射
- Multiple Contexts have a path of 错误的解决办法
- linux驱动之 platform分析
- 第六周作业1——利用哈夫曼编码英文字母表
- 好吧,从这里开始
- java面试准备之基础排序——快速排序
- VS2013中In-class initializer的一个问题
- C#try-catch用法及水仙花数,九九乘法表
- [ACM] poj 3468 A Simple Problem with Integers(线段树,成段更新,懒惰标记)