反射
时间:2019-07-04
本文章向大家介绍反射,主要包括反射使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解刨一个类,必须先要获取到该类的字节码文件对象。而解刨使用的就是Class类中的方法。所以先要获取每一个字节码文件对应的Class类型的对象。
阅读API的Class类得知,Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过类加载器中的defineClass方法自动构造的。
package com.zy.demo1; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception { // 做反射第一步,获取某个类的class对象 //第一种方式获取class对象 // User user = new User(); // Class class1 = user.getClass(); //第二种方式获取class对象 Class class2=User.class; //第三种方式 Class class3 = Class.forName("com.zy.demo1.User"); //三选一 //---------------- //就先在的User而言,我们怎么得到一个User对象[只有有构造方法,才能创建对象] //目标:是创建一个User对象 //反射是具有超能力的 //1得到构造对象 Constructor ct = class2.getDeclaredConstructor(); //暴力访问(报错遇到private) //java.lang.IllegalAccessException: Class com.zy.demo1. //Test can not access a member of class com.zy.demo1.User with modifiers "private" ct.setAccessible(true);//强行访问类中指定的私有构造方法 //2利用构造对象,调用api创建一个实例对象 User uu = (User)ct.newInstance(); //3调用User中的一个对象 System.out.println(uu.name);//不加暴力访问公开的name也不能访问 //------------------------------------- //目标2:获取私有属性 //我想拿到User中私有属性 Field df = class2.getDeclaredField("age"); //开暴力访问 df.setAccessible(true); //得到对象 Object object = df.get(uu);//传入刚才得到的一个user对象 //输出 System.out.println(object);//20[已经获取到了private age的值] //目标3:获取私有方法 Method mt = class3.getDeclaredMethod("show"); //开启暴力访问 mt.setAccessible(true); //调用方法 mt.invoke(uu); //小结:一个类中,(属性,方法,构造方法)[公私]都可以任意得到并使用 //-------------------------------------------------- //得到构造对象 Constructor ct2 = class2.getConstructor(int.class,String.class); //创建一个实例 User newInstance = (User)ct2.newInstance(30,"小明"); //输出 System.out.println(newInstance.toString()); Constructor[] constructors = class2.getConstructors(); System.out.println("长度:"+constructors.length);//1 一个公开的 Constructor[] declaredConstructors = class2.getDeclaredConstructors(); System.out.println(declaredConstructors.length);//2 公开私有都包括 //----------------------------------- //属性 Field field = class2.getField("name"); Object object2 = field.get(uu); System.out.println(object2);//花花 //------------------- Field[] fields = class2.getFields(); System.out.println(fields.length);//1 获取公开的 //------------------------ Field[] declaredFields = class2.getDeclaredFields(); System.out.println(declaredFields.length);//2 公开私有都包括 //暴力访问 declaredFields[0].setAccessible(true); declaredFields[1].setAccessible(true); System.out.println(declaredFields[0].get(uu)); System.out.println(declaredFields[1].get(uu)); //--------------------------------------- //方法 Method method = class2.getMethod("speak"); method.invoke(uu); Method[] methods = class2.getMethods(); System.out.println(methods.length);//10 公开的方法[Object9个+自己1个] Method[] declaredMethods = class2.getDeclaredMethods(); System.out.println(declaredMethods.length);//3 自己的公私 } }
原文地址:https://www.cnblogs.com/qfdy123/p/11134662.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [记录点滴] 记录一次用 IntelliJ IDEA遇到scope provided 的坑
- [记录点滴] 一个Python中实现flatten的方法
- [源码解析]Oozie来龙去脉之提交任务
- [记录点滴]Ionic编译过程的研究
- [记录点滴]OpenResty 支持http v2的问题
- [源码解析]Oozie来龙去脉之内部执行
- [记录点滴]编译安装luarocks、luacheck、luautf8
- [笔记整理] 一维搜索
- [记录点滴] 使用工具和命令对redis数据进行备份恢复
- [记录点滴]Spring Boot Admin源码分析笔记
- [记录点滴] luaxml编译过程
- [源码解析] Flink UDAF 背后做了什么
- [源码解析] 当 Java Stream 遇见 Flink
- [源码解析] Flink的Slot究竟是什么?(1)
- [源码解析] Flink的Slot究竟是什么?(2)