反射机制

来源:互联网 发布:淘宝店进货渠道有哪些 编辑:程序博客网 时间:2024/05/21 09:03

反射机制:

含义:

JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;
 对于任意一个对象,都能够调用它的任意一个方法和属性;
  这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
 动态获取类中信息,就是java反射 。
 可以理解为对类的解剖。


第一步:获取字节码对象:

第一种方式:

Object类中的getClass()方法的。 想要用这种方式,必须要明确具体的类,并创建对象。

Person p = new Person(); Class clazz = p.getClass();

第二种方式:

任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
 相对简单,但是还是要明确用到类中的静态成员。

Class clazz = Person.class;

第三种方式:

Class类中的

static Class<?>forName(String className)
          返回与带有给定字符串名的类或接口相关联的 Class 对象。

只要通过给定的类的 字符串名称就可以获取该类,更为扩展。
 用Class类中的方法forName()完成.
 这种方式只要有名称即可,更为方便,扩展性更强。

 

String className = "cn.itcast.bean.Person";Class clazz = Class.forName(className);

通过空参构造函数实例化

Class类中的

 TnewInstance()
          创建此 Class 对象所表示的类的一个新实例。

import java.io.FileReader;import java.lang.reflect.Constructor;public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {createNewObject();} public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{  String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//空参构造函数产生该类的对象 Object obj  = clazz.newInstance(); }}

通过有参构造函数实例化

第一步:Class类中的

 Constructor<T>getConstructor(Class<?>... parameterTypes)
          返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法 Constructor<?>[]getConstructors()
          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)
          返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 Constructor<?>[]getDeclaredConstructors()
          返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

第二步:构造器方法:

 TnewInstance(Object... initargs)
          使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

import java.io.FileReader;import java.lang.reflect.Constructor;public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {createNewObject_2();}public static void createNewObject_2() throws Exception {/* * 既然是通过指定的构造 函数进行对象的初始化, * 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。 * 该方法是:getConstructor(paramterTypes); *  */String name = "cn.itcast.bean.Person";//找寻该名称类文件,并加载进内存,并产生Class对象。Class clazz = Class.forName(name);//获取到了指定的构造函数对象。Constructor constructor = clazz.getConstructor(String.class,int.class);//通过该构造器对象的newInstance方法进行对象的初始化。Object obj = constructor.newInstance("小明",38); } }

获取字段:

 FieldgetField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 FieldgetDeclaredField(String name)
          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口 声明的所有字段 Field[]getDeclaredFields()
          返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段 Field[]getFields()
          返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

该字段的set()、get()方法:

 Objectget(Object obj)
          返回指定对象上此 Field 表示的字段的值。 voidset(Object obj,Object value)
          将指定对象变量上此 Field 对象表示的字段设置为指定的新值。对字段进行暴力访问
 voidsetAccessible(boolean flag)
          将此对象的 accessible 标志设置为指示的布尔值。解释:将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为false 则指示反射的对象应该实施 Java 语言访问检查。

import java.lang.reflect.Field;public class ReflectDemo3 { public static void main(String[] args) throws Exception {getFieldDemo();}/* * 获取字节码文件中的字段。 */public static void getFieldDemo() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Field field = null;//clazz.getField("age");//只能获取公有的,field = clazz.getDeclaredField("age");//只获取本类,但包含私有。 //对私有字段的访问取消权限检查。暴力访问。field.setAccessible(true);Object obj = clazz.newInstance();field.set(obj, 89); Object o = field.get(obj);System.out.println(o); }}





获取成员函数:

 MethodgetDeclaredMethod(String name,Class<?>... parameterTypes)
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 MethodgetMethod(String name,Class<?>... parameterTypes)
          返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法 Method[]getMethods()
          返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共成员 方法。 Method[]getDeclaredMethods()
          返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

运行获取到的方法:

 Objectinvoke(Object obj,Object... args)
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。


import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class ReflectDemo4 {public static void main(String[] args) throws Exception {getMethodDemo_3();}//获取有参数的一般方法、并运行public static void getMethodDemo_3() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method method = clazz.getMethod("show", String.class,int.class);Object obj = clazz.newInstance();method.invoke(obj, "小强",89);}//获取空参数一般方法、并运行public static void getMethodDemo_2() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method method = clazz.getMethod("show", null);Constructor constructor = clazz.getConstructor(String.class,int.class);Object obj = constructor.newInstance("小明",37);method.invoke(obj, null); }/* * 获取指定Class中的所有公共函数。 */public static void getMethodDemo() throws Exception {Class clazz = Class.forName("cn.itcast.bean.Person");Method[] methods  = clazz.getMethods();//获取的都是公有的方法。 methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包含私有。 for(Method method : methods){System.out.println(method);} }}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 信而富绑卡失败怎么办 回访电话说错了怎么办 乐贷款逾期一天怎么办 被贷款公司骚扰怎么办 趣店账户异常怎么办 指还王要还款下载不了怎么办 随心花账户异常怎么办 账号已被锁定怎么办 哈罗单车被警告怎么办 禁止安装拼多多怎么办 该用户行为异常怎么办 设备被禁止登录怎么办 你的设备被禁封怎么办 监控显示未配置怎么办 监控显示不在线怎么办 兔聊认证不通过怎么办 高考成绩被屏蔽怎么办 百合号码换了怎么办 微粒贷还款限额怎么办 秒白条扣款失败怎么办 信用卡逾期没还怎么办 催收发侮辱短信怎么办? 快贷还清后被拒怎么办 任信用还不起怎么办 信用飞额度抢光怎么办 装修工钱要不回怎么办 装修客户不给钱怎么办 公司赖账不给怎么办 欠钱不还还把我设置黑名单怎么办 别人欠钱留我电话怎么办 微贷审核不通过怎么办 客户赖账不还怎么办 货款拖欠想赖账怎么办 有欠条还赖账怎么办 个人欠货款逃跑怎么办 微信借钱被拉黑怎么办 朋友借钱忘记还怎么办 座机接不到电话怎么办 工地拖欠材料款怎么办 工地不付货款怎么办 生气引起的失眠怎么办