反射——Java反射机制
反射概述
什么是反射?
① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问、检测和修改它本身状态或行为的一种能力。
② JAVA反射机制是在运行状态中,对应任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种状态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
③ 简单的说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。
反射机制
① 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态和静态的概念?
a) 静态编译:在编译时确定类型,绑定对象,即通过。
Student stu=new Student(“zhangsan”,20);
b) 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,用以降低类之间的耦合性。
Class.forName(“com.mysql.jdbc.Driver.class”).newlnstance();
c) 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是J2EE的开发中。
d) 它的缺点是对性能有影响,使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作。
Java反射机制主要提供了以下功能
① 在运行时判断任意一个对象所属的类
② 在运行时构造任意一个类的对象
③ 在运行时判断任意一个类的所具有的成员变量和方法
④ 在运行时调用任意一个对象的方法
Class对象
① Class对象是Reflection故事起源。要想操作类中的属性和方法,都必须从获取Class对象开始。
a) 类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并编译一个新类,就会产生与之对应的一个Class对象。
b) Class类没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。
② 获取Class对象的方法有多种
|
获取方式 |
说明 |
示例 |
|
object.getClass() |
获取指定示例的 Class |
String str=”abc”; Class c1=str.getClass(); |
|
class.getSuperclass() |
获取当前Class 的继承类的 Class |
List list=new ArrayList(); Class listClass=list.getClass(); Class superClass= listClass.getSuperClass(); |
|
.class语法 |
.class直接获取 |
Class listClass=ArrayList.class; |
|
Class.forName(类名); |
用Class的静态方法,传入类的全称即可 |
Class c1=Class. forName(“java.lang.String”); |
|
Primitive.TYPE |
基本数据类型的包装类获取Class的方式 |
Class longClass=Long.TYPE; Class integerClass=Integer.TYPE; Class voidClass=Void.TYPE; |
示例:
创建一个雇员类
class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
主方法中获取Class对象:
public static void main(String[] args) {
Employee employee = new Employee("zhansan", 20);
// 对象名.getClass()
/*
/* Class<?> classType = employee.getClass();
* System.out.println(classType.getName());
* System.out.println(classType.getSuperclass().getName());
*/
// 类名.class
/*
* Class<?> classType=Employee.class;
* System.out.println(classType.getName());
* System.out.println(classType.getSuperclass().getName());
*/
// 使用Class.forName();
/*try {
Class<?> classType = Class.forName("com.iotek.classtype.Employee");
System.out.println(classType.getName());
System.out.println(classType.getSuperclass().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}*/
//获取基本数据类型的Class对象
//Class<?> classType = int.class;
//System.out.println(classType.getName());
//System.out.println(classType.getSuperclass().getName());//无父类null值无法获取getName()
//通过基本数据类型的包装类来获取
//对应的基本数据类型对应的Class对象
//Class<?> classType=Double.TYPE;
//System.out.println(classType.getName());
//System.out.println(classType.getSuperclass().getName());
Class<?> classType=Double.class;
System.out.println(classType.getName());
System.out.println(classType.getSuperclass().getName());
}
}
反射——Java反射机制的更多相关文章
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- 浅谈java反射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- java反射机制与动态代理
在学习HadoopRPC时.用到了函数调用.函数调用都是採用的java的反射机制和动态代理来实现的,所以如今回想下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机 ...
- 基础篇:深入解析JAVA反射机制
目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...
- java反射知识
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java反射、反射练习整理
反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- 公共技术点( Java 反射 Reflection)
转载路径:http://p.codekk.com/blogs/detail/5596953ed6459ae7934997c5 本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 ...
- java反射基础知识(二)
1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...
- 公共技术点之 Java 反射 Reflection
本文摘录地址: http://codekk.com/open-source-project-analysis/detail/Android/Mr.Simple/%E5%85%AC%E5%85%B1%E ...
随机推荐
- [转载]《民航科技》2012年4月专家论坛:程延松《关于中国民航SWIM框架及技术实现探讨》
专家介绍:程延松,现任成都民航空管发展有限公司总经理,理学博士,高级工程师,长期从事空管技术研究和产品研发工作,作为课题负责人,参与了国家863计划.国家科技支撑计划.国家空管委重点课题.民航局重点课 ...
- nodejs + ionic2 + cordova环境搭建
1.nodejs 下载地址:https://nodejs.org/zh-cn/,执行默认安装就可以,可执行命令 node(环境变量) 2.修改 npm 源,执行:npm config set regi ...
- 3.1 ARM汇编编程概述
1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...
- clientWidth、offsetWidth和scrollWidth的区分
scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变. off ...
- JOST数据 日期转换
开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: 复制代码代码如下: //设置服务 ...
- 10款让WEB前端开发人员更轻松的实用工具
这篇文章介绍10款让Web前端开发人员生活更轻松的实用工具.每个Web开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具,所以如 ...
- "递归"实现"约瑟夫环","汉诺塔"
一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...
- pdo 整套类的封装,保存修改查询
<?php /** * */ class Db{ private $host = ''; private $port = ''; private $user = ''; private $pas ...
- Python-lambda函数,map函数,filter函数
lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: ma ...
- 页面可见生Page Visibility
Page Visibility 会在浏览器的 document 对象上添加两个属性 hidden 和 visibilityState .如果当前的标签被激活了,那么 document.hidden 的 ...