黑马程序员-Java的反射学习笔记
来源:互联网 发布:流量控制软件电脑 编辑:程序博客网 时间:2024/04/28 15:09
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
反射介绍
反射,就是把Java类中的各种成分映射成相应的Java类。
程序要运行期间通过类名就能知道类的所有信息,构造函数、方法、成员变量。
Java中,一个字节码文件被类加载器加载进内存中后是一个Class类的实例,Class中有返回成员方法、变量、构造函数类的方法。Java中,类中的方法、变量都可以用类来表示,Method类表示成员方法、Field类表示类的成员变量。Constructor类表示类的构造函数。
反射的可以干什么
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
Java中,通过下面的类实现反射机制:
ClassFiledMethodConstructorArray
Class类
实现反射的基础,Java源代码通过编译后生成字节码文件,*.class文件。通过类加载器加载进内存后,就是Class类的一个实例。Class类就是描述类的一个类。类有成员方法、成员属性、构造函数。Class类的实例就是加载进内存后的字节码。
获取Class实例的4种方法
通过运行时类本身的属性获取
假设有一个Person类,通过类的.class属性获取Class clazz = Person.class;
通过运行时类的对象的方法获取
Person p = new Person():Class clazz = p.getClass();
通过Class类的静态方法获取
String str = "hello,heima!";Class clazz = Class.forName(str);
通过类的加载器
Person p = new Person();ClassLoader clalod = this.getClass().getClassLoader();clalod.loadClass(p);
通过运行时类创建对象
通过创建对应的运行时对象,调用运行时类的newInstance()方法,调用newInstance方法,对调用运行时类的空参数构造器。构造器的权限要足够。
假设com.Reflection包下有Person类。Person类的空参数构造器会打印:“空参数构造器”字符串。
String str = "com.Reflection.Person"; Class clazz = Class.forName(str); Object obj = clazz.newInstance(); Person p = (Person)obj; System.out.println(p); 输出结果: 空参数构造器 Person [name=null, age=0]
通过反射获取类的完整结构
Person类如下:
获取成员变量
通过getField方法获取到运行时类本身的一个成员属性,然后通过Field实例的
get方法获取属性的值。getField只能获取权限为public的成员属性。
Field getField();
public static void test3() throws Exception{ String className = "com.Reflection.Person"; Class clazz = Class.forName(className); Person p = new Person(); Field field = clazz.getField("id"); //获取名字为id的成员属性 System.out.println( field.get(p)); //获取属性的值}
Field[] getFields();
获取运行时类本身和父类中声明权限为public的成员变量
public static void test3() throws Exception{ String className = "com.Reflection.Creature"; Class clazz = Class.forName(className); Field f1[] = clazz.getFields(); for (int i = 0; i < f1.length; i++) { System.out.println(f1[i]); }}打印结果: 空参数构造器 public double com.Reflection.Creature.weight public int com.Reflection.Person.id
获取运行时类本身中声明权限为public的所有成员变量
Field[] getDeclaredFields();
Field f2[] = clazz.getDeclaredFields();for (int i = 0; i < f2.length; i++) { System.out.println(f2[i]);}打印结果: public double com.Reflection.Creature.weight
获取属性的所有内容
getName()
System.out.println(f1[i].getName()); 打印为:weight
获取权限修饰符:
getModifiers()
System.out.println(Modifier.toString(f1[i].getModifiers()));打印为:public public
getType() 返回属性的类型的Class对象
System.out.println(f1[i].getType());
获取返回值类型:
Class getReturnType();
Class returnType = f1[i].getReturnType(); System.out.println(returnType.getName());
获取形参列表
Class[] returnClass = fMethod.getParameterTypes();
获取构造方法
一个Constructor类实例代表一个构造方法。
Constructor constructor = Person.class.getConstructor(); Person p1 = (Person) constructor.newInstance(); //通过调用Constructor的实例的newInstance方法,就像调用 //Person类的构造方法一样,创建了Person的一个实例。 System.out.println(p1.getName());
newInstance方法的参数个数是可变参数,比如调用有参构造方法就是
getConstructor(Class
- 黑马程序员-Java的反射学习笔记
- 黑马程序员---java 反射 学习笔记
- 黑马程序员------java学习笔记之反射
- 黑马程序员-java学习笔记-反射
- 【黑马程序员】 学习笔记 - Java新技术 - 反射
- 黑马程序员 java学习笔记 Day10:反射
- 黑马程序员 JAVA基础学习笔记 反射
- 黑马程序员--java反射学习笔记
- 黑马程序员--JAVA反射学习笔记2
- 黑马程序员Java学习笔记之反射
- 黑马程序员--学习笔记--Java反射
- 黑马程序员 java 反射的深入学习
- 【黑马程序员】java反射的学习总结
- 黑马程序员---反射学习笔记
- 黑马程序员 反射学习笔记
- 黑马程序员---反射学习笔记
- 黑马程序员-反射学习笔记
- 黑马程序员----反射学习笔记
- 选择排序
- mac下搭建php开发环境
- 140.Word Break II
- 图像检索公开数据集
- Pav Metro Store OpenCart 自适应主题模板 ABC-0215
- 黑马程序员-Java的反射学习笔记
- 2.6
- 导弹拦截
- 《C++语言基础》实践项目——银行储蓄系统开发
- 关于vc++6.0安装配置MPI
- LeetCode --- 96. Unique Binary Search Trees
- OS开发拓展篇—CoreLocation地理编码
- UIWebView全部API学习。
- C++中动态申请数组