Chen's WinterSakura
TOP
主页 空间 收藏 IT资讯 分享 联系建议

学习分享

最坏的习惯,是苟安于当下的生活,不知道明天的方向

Java反射、什么是反射

什么是反射机制

       反射机制是在运行状态中,对任意个类,都能知道这个类的所有属性,方法;对于任意一个对象,都能够动态调用它的任意一个方法和属性;这种动态获取信息以及动态调用的功能称之为JAVA的反射机制;

总结:

       a. 动态获取类的描述;例如动态的获取类的名字,包名,构造器,方法,字段

       b. 动态的调用对象的方法和属性; 例如输入什么方法名就调用对象的什么方法

java.lang.Class

       Class 是反射的核心类,是故事的起源       反射就像镜子,映出类的描述

什么是Class

       任意类都有一个Class类型的对象与之对应; 这个Class类型的对象描述着这个类

// 第一种方式, 通过类名.class 属性
       Class c1 = Student.class;
// 第二种方式, 通过对象.getClass 方法
       Class c2 = new Student().getClass();
// 第三种方式, 通过Class.forName("包名.类名")
       Class c3 = Class.forName("com.panshi.Student");
// 打印信息
       System.out.println(c1 + " :" + c1.getName());
       System.out.println(c2 + " :" + c2.getName());
       System.out.println(c3 + " :" + c3.getName());

总结:

       1.任意类有且仅有一个class对象

       2.class对象描述着这个类

通过class对象获取指定类的描述信息

// 获取构造器

       getConstructors(); // 获取所有构造器 (只能访问public 修饰)

       getDeclaredConstructors(); // 获构造器 (可以访问到非public修饰)

       getConstructor(Class... parameterTypes); // 获取指定构造器

       getDeclaredConstructor(Class... parameterTypes);

// 获取字段

       getFields();

       getDeclaredFields();

       getField(String name);

       getDeclaredField(String name);

// 获取定义的方法

       getMethods()

       getDeclaredMethods()

       getMethod(String name, Class... parameterTypes)

       getDeclaredMethod(String name, Class... parameterTypes)

java.lang.reflect.Constuctor

是什么

       构造器的描述对象,描述着指定类的构造器

能做什么

       允许通过其newInstance()方法来创建对象的实例

反射创建对象实现步骤:

第一步:获取class对象

       Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述

第二步:通过class对象获取到其构造器描述

       Constructor constructor = clazz.getConstructor([参数类型列表]);

第三步:调用构造器描述的newInstance来创建实例对象

       Foo foo = constructor.newInstance([参数列表]);

无参构造器实例化(简化)(调用无参构造器实例化)

       Class clazz = Foo.class;

       Foo foo = clazz.newInstance();

java.lang.reflect.Method

是什么

       方法的描述对象,描述着指定类的方法

能做什么

       允许通过invoke()方法来动态调用对象

反射调用方法实现步骤

第一步: 获取class对象

       Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述

第二步: 通过class对象获取到指定的方法描述

       Method method = clazz.getMethod("setName", String.class);

第三步: 反射调用

       method.invoke(foo,"小明"); // 等同于 foo.setName("小明");

java.lang.reflect.Field

是什么

       提供有关类或接口的单个字段的信息

能做什么

       允许通过get,set方法来动态取值,设值

实现步骤

第一步: 获取class对象

       Class clazz = Class.forName("com.panshi.Foo"); // clazz对象是Foo的描述

第二步: 通过类描述获取到字段描述

       Field field = Class.getField("name");

第三步: 反射调用

       field.set(foo, "小明"); // 等同于 foo.name = "小明";

       Object value = field.get(foo); // 等同于 Object value = foo.name;

免责声明

本网站属于个人的非盈利性网站、博客,主要是一些学习过程中的一些心得分享和笔记,同时可能存在部分非私人原创撰写的文章,由于在过程中浏览过别人分享于本人的资源,可能一些源自于网络,亦可能误摘抄他人分享转载的文章,按照目前互联网开放的原则,将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,被本人误载入,非常抱歉,请务必来信告知:miku109040azusa@vip.qq.com

© 2016-2017 Build by Chen | WinterSakura.COM 粤ICP备17119124号