Java 之 反射
1.反射
a.意义:允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性
b.概括:运行时探究和使用编译时未知的类
c.反射的核心原理:
①JVM在加载一个类的时候,会把该类的信息存放到一个Class对象中。该对象又被称之为类模板对象。JVM可以通过检索该对象,
得到这个类所拥有的各种信息(名字、所在包、父类、实现接口、属性、构造、行为......)
②JDK提供API,允许程序员获取到类的Class对象,导致程序员也可以检索到这个类的这些信息,即便这个类不是这个程序(或程序员)所实现的。
d.三步骤:
①获取到Class对象
②探究类的信息
③使用探究到的信息
2.获取到Class对象
a.通过类型名获取Class对象
Class stuClass = StudentBean.class;//类
Class strClass = String.class;
Class runnableClass = Runnable.class;//接口
Class intArrayClass = int[].class;//数组
Class intClass = int.class;//基本数据类型---JDK1.5以后才有的
Class intClass0 = Integer.TYPE;//JDK1.5之前使用对应包装类.TYPE获取基本类型的Class对象
Class voidClass = void.class;
特点:①所有的类型都可以获得到Class对象
②因为在编写代码时已知类型名,所以没有动态性
b.通过实例对象获取Class对象
StudentBean stu = new StudentBean();
Class stuClass1 = stu.getClass();
Class strClass1 = "hello".getClass();
int[] intArray = new int[5];
Class intArrayClass1 = intArray.getClass();
特点:①只有非抽象类类型和数组类型可以通过该方式获取到Class对象
②抽象类、接口、基本数据类型、void都不可以
③因为在编写代码时已得到实例对象,所以也没有动态性
c.通过类型名的字符串形式获取Class对象
String className = JOptionPane.showInputDialog("请输入你要加载的类的类名");
Class stuClass2 = Class.forName(className);
特点:①类和接口可以通过该方式获取Class对象,细节:1、必须填写类全名(包含包名);2、先完成主动加载,然后返回Class对象
②这是唯一一种动态性的体现,以后会大量使用,表现在各种框架中书写配置文件
3.通过Class对象探究类的信息
a.探究类的基本信息
String className = stuClass.getName();//得到类全名
String classSimpleName = stuClass.getSimpleName();//类的简单名
String packageName = stuClass.getPackage().getName();//类的包名
String superClassName = stuClass.getSuperclass().getName();//得到该类父类类名
Class[] allInterfaces = stuClass.getInterfaces();//得到该类实现的接口
String classMod = Modifier.toString(stuClass.getModifiers());//得到修饰符
b.探究属性——Field
Field[] allFields = stuClass.getFields();//探究所有的公共属性(包括从父类继承而来的)
Field[] allDeclaredFields = stuClass.getDeclaredFields();//探究所有被声明的属性(不包括从父类继承而来的) Field theField = stuClass.getField("name");//探究指定的公共属性(包括从父类继承而来的)
Field theDeclaredField = stuClass.getDeclaredField("name");//探究指定的被声明的属性(不包括从父类继承而来的) String fieldName = field.getName();//属性名
String fieldMod = Modifier.toString(field.getModifiers());//修饰符
String fieldType = field.getType().getName();//类型名
c.探究构造——Constructor(基本同上)
Class[] conParams = con.getParameterTypes();//形参类型
Constructor theDeclaredCon = stuClass.getDeclaredConstructor(String.class,int.class);//探究指定的被声明的构造
d.探究行为——Method(基本同上)
String methRrturnParams = meth.getReturnType().getName();//返回类型
Class[] methThrow = meth.getExceptionTypes();//异常类型
Method theDeclaredCon = stuClass.getDeclaredMethod("study");//探究指定的被声明的方法
4.使用探究到的信息
a.探究到Constructor,就可以产生实例对象
StudentBean theStu = null;
Constructor theDeclaredCon = stuClass.getDeclaredConstructor(String.class,int.class);
theStu = (StudentBean)theDeclaredCon.newInstance("张三",28);
b.探究到Method,就可以调用方法
Method m = stuClass.getDeclaredMethod("study", int.class);
m.invoke(theStu, 5);
c.探究到Field,就可以赋值/取值
Field f = stuClass.getDeclaredField("name");
f.setAccessible(true);
f.set(theStu, "王小二");
System.out.println(f.get(theStu));
5.在使用探究到的信息时,有一些细节:
a.反射产生实例对象,是Java中我们学到的第三种产生对象的方式(new, 反序列化,反射)
b.在反射产生实例对象时,可以直接调用Class对象的newInstance方法获得实例对象;
但它只能调用公共无参构造!这就是JavaBean的第一规范的原因。
c.私有属性在反射中操作,都是调用它公共的get和set方法。这是JavaBean第二规范的原因
d.反射是Java的底层实现,其实是可以破坏封装性直接操作任意访问修饰符的构造/属性/方法的;
但是这违背了OO的设计思想,不准用!
StudentBean stu0 = (StudentBean) stuClass.newInstance();
Java 之 反射的更多相关文章
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
随机推荐
- as3 组件定义
package kingBook{ import flash.display.MovieClip; import flash.events.Event; import flash.utils.setT ...
- Air打包exe
1.用flash创建一个airtest.fla,发布目标选择为AIR.ctrl+enter会得到如下文件: 2.把flex sdk的bin中找到adl.exe,复制过来,放置到:项目目录\bin\ad ...
- 转:Loadrunner学习知多少--脚本录制下载操作
在很多时候我们可能需要对系统进行这样的脚本开发,模拟用户点击一个下载链接,然后弹出下载框,选择保存,用来测试在大量用户下载时服务器的性能.但是现在大家对于这种脚本的处理方式往往是通过关联和C 语言的文 ...
- 使用Retrofit和RxJava
使用Retrofit和RxJava整合访问网络,然后将数据显示到界面上 def retrofitVersion = '2.0.0-beta1' dependencies { compile fileT ...
- hdu_5085_Counting problem(莫队分块思想)
题目连接:hdu_5085_Counting problem 题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个 题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两 ...
- 区间的关系的计数 HDU 4638 离线+树状数组
题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...
- HDU 1204 基础DP 非连续字段的最大和
其实这个感觉是一眼题,只不过我真心太菜了. 题目已经告诉你了,有m段,n个数字,那么我们就只需要dp[m][n]即可,然后最后的答案肯定是dp[m][]的那一行,所以其他行都是没有用的,因为我们可以把 ...
- 10、桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
- mysql show processlist详解
SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到所有线程.否则,您只能看到您自己的线程( ...
- CGI接口原理及实现(转载)
原文:http://blog.csdn.net/duola_rain/article/details/15812585 CGI接口原理及实现(2012-12-7 Over) 1.CGI定义: CGI( ...