JAVA 中的 反射
CLASS类
1) 在面向对象的世界里,万事万物皆对象.
在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西
2) 类是对象吗? 类是对象,类是java.lang.Class类的实例对象
3) 任何一个类都是CLass类的实例对象,有三种表示方法
第一种表示方法 Class c1 = (类名).class;
实际在告诉我们任何一个类都有一个隐含的静态成员变量class
第二种表示方法 已经知道该类的对象通过getClass方法
第三种官网 c1表示是类的类型(Classtype)万事万物皆对象 类也是对象 是Class类的实例队象这个对象我们称为该类的类类型
Class c3 = null;
c3 = Class.forName("reflexdemo.Foot") Class.forname中是类的全路径(含包名);
我们可以通过类的类类型创建该类 的对象实例 通过c1 或者c3创建
Foot foot=(Foot)c1.newInstance(); 需要强制类型转换
1 package reflexdemo; 2 3 /** 4 * @2018年4月6日 5 * @王 鸿 6 * @Administrator 7 */ 8 public class Foot { 9 public int age = 10; 10 } 11 12 测试类 13 14 package reflexdemo; 15 16 /** 17 * @2018年4月6日 18 * @王 鸿 19 * @Administrator 20 */ 21 public class Refle_Demo_01 { 22 public static void main(String[] args) throws Exception { 23 // 创建一个Foot的实例对象 24 Foot foot = new Foot(); 25 // 第一种 Foot这个类也是一个实例对象,Class类的对象 26 Class c1 = Foot.class; 27 // 第二种通过对象.getclass方法 28 Class c2 = foot.getClass(); 29 // 不管 c1 ,c2 都代表着Foot类的类型,一个类只可能是class类的一个实例对象 30 System.out.println(c1 == c2); 31 // 第三种表达方式 32 Class c3 = null; 33 // Class.forname中是类的全路径(含包名) 34 c3 = Class.forName("reflexdemo.Foot"); 35 System.out.println(c2 == c3); 36 // 创建类的实例 37 Foot foot1 = (Foot) c3.newInstance();// 需要无参的构造 38 System.out.println(foot1.age); 39 } 40 }
为什么需要反射?
1 通过new创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用的类 (通过动态加载类可以解决该问题)
2 动态加载类是在运行的时刻加载 ------------------(一般情况下功能性的类使用动态加载类)
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性("套用别的博客一句话")
下面的代码可以看到通过类 来反射类的信息 包括构造 还有方法
package datatype;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** @2018年4月7日* @王 鸿* @Administrator*/ public class ClassMessage {/** 打印类的信息 包括类的成员函数成员变量*/public static void print(Object obj) {// 要获取类的信息 首先获取类的类类型Class c = obj.getClass(); // 传递的是那个子类的对象 c 就是那个类的类类型// 获取类的名称System.out.println("类的名称:" + c.getClass());/** 一个成员方法就是一个 Method对象 .getMethods()是获取所有的public的函数包括父类继承而来* * getDeclaredMethods()获取的是所有该类自己声明方法*/Method[] methods = c.getMethods();for (int i = 0; i < methods.length; i++) {// 的到方法的返回类型Class returnType = methods[i].getReturnType();System.out.print(returnType.getName());// 得到方法的名称System.out.print(methods[i].getName() + "(");// 获取参数的类型-->得到的是参数列表的类类型Class[] parameterTypes = methods[i].getParameterTypes();for (Class class1 : parameterTypes) {System.out.print(class1.getName());}System.out.println(")");FiledMessage(c);}}/** 获取成员变量的信息*/public static void FiledMessage(Object obj) {Class c = obj.getClass();Field[] declaredFields = c.getDeclaredFields();for (Field field : declaredFields) {// 得到成员变量的类型的类类行Class filedtype = field.getType();String name = filedtype.getName();// 得到成员变量的名称String filename = field.getName();System.out.println(name + " " + filename);}}/** 打印构造函数的信息 获得所有的构造方法*/public static void Constructor(Object obj) {Class c = obj.getClass();Constructor[] constructors = c.getDeclaredConstructors();for (Constructor cs : constructors) {System.out.print(cs.getName() + "(");// 获取构造函数的参数列表Class[] parameterTypes = cs.getParameterTypes();for (Class class1 : parameterTypes) {System.out.print(class1.getName() + ",");}System.out.println(")");}} }/**打印方法* 打印的方法是又新开了一个类*/package datatype;import java.lang.reflect.Method;/*** @2018年4月8日* @王 鸿* @Administrator*/public class MethodMessage {public static void main(String[] args) throws Exception {A a = new A();// 要想获得一个方法的信息首先要获得类的类类型Class type = a.getClass();// 获取方法 方法必须要有名称和参数列表/** getMethod 获取的是public的方法 getDeclaredMethod自己声明的方法*/Method method = type.getDeclaredMethod("append", String.class,String.class);// 如果是私有的需要用.setAccessible(true)method.setAccessible(true);// 方法没有返回值返回的null 有返回值放回指定的返回值method.invoke(a, "1", "2");} }class A {public void print(int a, int b) {System.out.println(a + b);}private void append(String one, String two) {System.out.println(one + two);} }测试类package datatype;/*** @2018年4月7日* @王 鸿* @Administrator*/ public class ClassMessageText {public static void main(String[] args) {Integer type = 2;String string = "s";// ClassMessage.print(type);// ClassMessage.FiledMessage(new Integer(1)); ClassMessage.Constructor(string);} }
此处指截取了一张构造反射出来的结果
注意: 方法的反射 如果你的方法是私有的 需要加上 方法对象.setAccessible(true)
通过反射了解集合泛型的本质
反射的操作都是编译之后的操作,集合的泛型是去泛型化的
java 中的集合泛型 是防止 错误输入的,只在编译阶段有效 绕过编译就无效了
package genericparadigm;import java.lang.reflect.Method; import java.util.ArrayList;/*** @2018年4月8日* @王 鸿* @Administrator*/ public class GenericList {public static void main(String[] args) throws Exception, SecurityException {// 非泛型集合ArrayList one = new ArrayList();// 泛型集合ArrayList<String> list = new ArrayList<String>();Class class1 = one.getClass();Class class2 = list.getClass();System.out.println(class1 == class2); // trueMethod method = class2.getMethod("add", Object.class);method.invoke(list, 1);System.out.println(list.size()); // 1 } }
转载于:https://www.cnblogs.com/wh1520577322/p/8745277.html
JAVA 中的 反射相关推荐
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- Java 中使用反射来创建对象、调用方法
Java 中使用反射来创建对象.调用方法 反射创建对象 反射调用方法 反射调用私有方法 反射调用可变参私有方法 反射调用的方法自身可以抛出异常的情形 假设已有下面的类: import java.l ...
- java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...
- 深入理解Java中的反射技术
Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法:这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射 ...
- formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化
今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...
- java中的反射机制是什么
给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...
- Java中的反射和枚举
假设现在上面的数据是以二次探测的方式来进行存放的,现在让你求: 现在找1:直接就能找到----->次数是1 现在找4:直接就可以找到---->次数是1 现在找14:先得到4的下标,发现不是 ...
- Java中的反射机制详讲
Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...
- Java中的反射如何理解——精简
目录 引言 反射概念 反射获取类对象 反射获取构造器对象 获取构造器对象并使用 反射获取成员变量对象 反射获取方法对象 反射获取成员方法并使用 引言 经过前面的学习,相信大家已经能够对网络编程有了一定 ...
- 什么是java中的反射?反射的一些常用方法
一.什么是java中的反射 Java 反射,就是在运行状态中. 获取任意类的名称.package信息.所有属性.方法.注解.类型.类加载器等 获取任意对象的属性,并且能改变对象的属性 调用任意对象的方 ...
最新文章
- 京东典型广告推广源码示例一
- md5后得到的32位字符串存储到mysql中太占空间了_好看!快收藏:非常完整的 MySQL 规范...
- 前端工程师后端转型实录
- Scala _11SparkWordCountscala语言java语言
- java-回调机制详解
- java笔记--重定向输出流实现程序输出到日志
- html有序列表序号怎么变色,html – 如何正确标记/样式有序列表以补偿大项目编号...
- 计算机安装应用程序卸的步骤,电脑软件怎么卸载,干货在这里,如何卸载电脑上安装的软件...
- Java定时器的cron设置详解Quartz
- web前端好学吗?如何能提高CSS编写技巧 提高Web前端开发效率
- 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)
- 【100题】第十九题(斐波那楔数列)
- 那些年,我们一起追的女孩。
- Redis常见配置文件详解
- namenode和datanode的功能分别是什么_海德堡印刷机电路板分别是什么功能
- mysql lambda查询_SqlSugar常用查询实例-拉姆达表达式
- Java面试宝典Beta5.0
- windows7台式计算机网线连接,win7台式机连接wifi的方法步骤详解(2)
- 微信网页授权获取用户昵称中文乱码
- airplus.exe