黑马程序员 学习日志10 反射
来源:互联网 发布:access数据库开发实例 编辑:程序博客网 时间:2024/05/29 09:23
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
反射
反射的基石:class
java程序中各个java类属于同一类事物,描述这类事物的java类名就是class。
Class类代表java类,它的各个实例对象对应什么呢?
对应各个类在内存中的字节码。
一个类被类被类加载器加载到内存中,占用一片存储空间,这片空间里的内容就是类的字节码,不同的类的字节码是不同的,所以它在内存中的内容是不同的,这一个个的空间用不同的对象来表示,这些对象具有相同的类型。
如何得到各个字节码对应的实例对象呢?
1.类名.class,例如:System.class
2.对象.getClass(),例如:new Date().getClass();
3.Class.forName("类名"),例如:Class.forNmae("java.util.Date");
九个预定义的Class对象:8个基本数据类型+void。
int.class != Integer.class;
int.class == Integer.TYPE;
判断是否是基本类型用Class.isPrimitive();
数组类型的Class实力对象
Class.isArray();
总之只要是在源程序中出现的类型,都有各自的Class实例对象,例如int[] , void .
反射就是把JAVA类中的各个成分映射成相应的java类
它们是:Field,Method,Constructor,Package等等。
Constructor类:得到某个类的构造方法。
例子:得到某个类所有的构造方法
<span style="font-size:24px;">Constructor[] constructors = Class.forName("java.lang.String").getConstructors(); </span>例子:得到某一个构造方法。
<span style="font-size:24px;">Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获得方法时使用类型</span>
创建实例对象:
通常方式:
<span style="font-size:24px;">String str = new String(new StringBuffer(“abc”);</span>反射方式:
<span style="font-size:24px;">String str = (String)constructor.newInstance(new StringBuffer("abc"));//调用方法时使用和上面一样的类型</span>使用默认构造方法:
<span style="font-size:24px;">String str = (String)Class.forName("java.lang.String").newInstance();</span>
Field类代表某个类中的成员变量
<span style="font-size:24px;">public class Reflect01 {public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {ReflectPoint r1 = new ReflectPoint(2,4);Field fieldx = r1.getClass().getField("x");//fieldx不是对象身上的变量,而是类上,要用它去取某个对象上对应的值System.out.println(fieldx.get(r1));//获取private修饰的变量需要用getDeclaredField()方法Field fieldy = r1.getClass().getDeclaredField("y");//修改private修饰的变量需要用setAccessible()方法fieldy.setAccessible(true);System.out.println(fieldy.get(r1));}}class ReflectPoint{public int x;private int y;public ReflectPoint(int x, int y) {super();this.x = x;this.y = y;}}</span>
Method类代表某个类中的一个成员方法
得到类中的某一个方法
例子:
<span style="font-size:24px;">Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);</span>调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
如果传递给invoke方法一个参数为null,说明该Method对象是一个静态方法。
数组的反射:
具有相同元素和维度的数组属于同一个类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
0 0
- 黑马程序员 学习日志10 反射
- 黑马程序员--学习日志--反射
- 黑马程序员-----反射的学习日志
- 黑马程序员-学习日志10
- 黑马程序员 反射学习
- 黑马程序员--反射学习
- 黑马程序员 10 反射
- 黑马程序员 反射学习日记
- 黑马程序员---反射学习笔记
- 黑马程序员---反射的学习
- 黑马程序员_java反射学习
- 黑马程序员 反射学习笔记
- 黑马程序员学习_反射
- 黑马程序员---反射学习笔记
- 黑马程序员 java反射学习
- 黑马程序员-Java反射学习
- 黑马程序员学习日记--反射
- 黑马程序员-反射学习笔记
- C语言实现字符串截取函数left、mid和right
- 单机存储引擎
- sqlserver 多表查询不同数据库服务器上的表
- Cubert:LinkedIn开源的大数据计算引擎
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 黑马程序员 学习日志10 反射
- xUtils图片本地缓存使用
- MFC文档视图结构-开篇语
- C#多线程环境下调用 HttpWebRequest 并发连接限制
- F7控件增加监听实例
- 苹果OS X 10.10.1更新啦,BUT BUG
- java HelloWorld 编程风格实践
- 动态规划专题(III)
- java文本读取写入