Java技术——Java反射机制分析
1. Java的反射机制
动态语言是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。但Java它却有着一个非常突出的动态相关机制:反射。
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:
(1)在运行时判断任意一个对象所属的类;
(2)在运行时构造任意一个类的对象;
(这一条在下面没有展示实例,但在之前写过的一篇Java中创建对象的5种方式中有所介绍,有兴趣的可以参考查看。)
(3)在运行时判断任意一个类所具有的成员变量和方法;
(4)在运行时调用任意一个对象的方法;
(5)生成动态代理。
2. Java反射API
反射API用来生成在当前Java虚拟机中的类、接口或者对象的信息。
Class类:反射的核心类,可以获取类的属性,方法等内容信息。
Field类:Java.lang.reflect.表示类的属性,可以获取和设置类的中属性值。
Method类:Java.lang.reflect。表示类的方法,它可以用来获取类中方法的信息或者执行方法
Construcor类:Java.lang.reflect。表示类的构造方法。
3.反射常见用法
3.1 判断对象是否属于反射得到的类(isInstance)
class S {
}
public class IsInstance {
public static void main(String args[]) {
try {
Class cls = Class.forName("S"); //创建了一个S类的Class对象
boolean b1 = cls.isInstance(new Integer(37));
System.out.println(b1); //fasle
boolean b2 = cls.isInstance(new S());
System.out.println(b2); //true
}
catch (Throwable e) {
System.err.println(e);
}
}
}
3.2 获取某个反射类的所有属性字段
/**
* 获取反射类的所有属性字段
*
* @param ownerClass 反射的类
* @return
* @throws Exception
*/
public Field[] getProperty(Class ownerClass) throws Exception { //获取该类所有属性字段
//Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)
Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类) //输出所有属性字段
for(int i=0;i<fields.length;i++){
System.out.println("属性:"+fields[i]);
} return fields;
}
3.3 获取反射类的某个public属性值
/**
* 获取反射类的某个public属性值
*
* @param ownerClass 反射的类
* @param fieldName 属性名
* @return
* @throws Exception
*/
public Object getProperty(Object owner,String fieldName) throws Exception { //得到对象所属类
Class ownerClass = owner.getClass(); //获取该类的某个属性
Field field = ownerClass.getField(fieldName); //获取某个对象的特定属性
Object property = field.get(owner); //输出该属性信息
System.out.println(fieldName+"的属性值:"+property.toString()); return property; }
3.4 获取反射类的该中的所有方法
/**
* 获取反射类的该中的所有方法
* @param ownerClass 反射的类
* @return
* @throws Exception
*/
public Method[] getMethods(Class ownerClass) throws Exception { //获取该类所有方法
//Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)
Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类) //输出所有方法
for(int i=0;i<methods.length;i++){
System.out.println("方法:" +methods[i]);
} return methods;
}
3.5 执行反射类的该中的某个方法
/**
* 执行反射类的该中的某个方法
* @param ownerClass 反射的类
* @param methodName 方法名
* @return
* @throws Exception
*/
public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception { //得到对象所属类
Class ownerClass = owner.getClass(); //获取该类的某个方法
Method method = ownerClass.getMethod(methodName, null); //执行某个对象的方法
Object result = method.invoke(owner, args); //输出结果信息
System.out.println("结果返回值:"+ result); return result;
}
实例演示方法:
/**
* 测试反射常用方法
*/
public void refTest(){
String className = "com.java.reflecttest.Student"; try { //通过反射机制,使用类装载器,装载该类
Class<?> stu = Class.forName(className);
Object objStu = stu.newInstance(); //获取反射类的所有属性
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getProperty 方法,获取Student类的所有属性");
getProperty(stu); //获取反射类的某个属性值
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");
getProperty(objStu,"NAME"); //获取反射类的所有方法
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 getMethods 方法,获取Student类的所有方法");
getMethods(stu); //执行反射类的getInfo方法
System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");
invokeMethod(objStu, "getInfo", null); } catch (Exception e) {
e.printStackTrace();
}
}
演示所用的Student类:
package com.java.reflecttest; /**
* 学生信息类
*
* @author Longxuan
*
*/
public class Student { /**
* 学号
*/
private String stuId ; /**
* 学号
*/
public String STUID; /**
* 姓名
*/
private String name ; /**
* 姓名
*/
public String NAME; /**
* 年龄
*/
private int age; /**
* 年龄
*/
public int AGE; /**
* 班级
*/
private String classid; public String getStuId() {
return stuId;
} public void setStuId(String stuId) {
this.stuId = stuId;
} 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 String getClassid() {
return classid;
} public void setClassid(String classid) {
this.classid = classid;
} /**
* 输出学生信息
*/
public void getInfo(){
System.out.println("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+classid);
} /**
* 构造函数
*/
public Student(){
init();
} /**
* 私有初始化方法
*/
private void init(){
this.name = "张三";
this.stuId ="1001";
this.age = 14;
this.classid = "A001";
this.NAME = name;
this.AGE = age;
this.STUID = stuId;
} }
运行结果:
4. 反射的效率
在Stackoverflow上认为反射比较慢的程序员主要有如下看法,如果你面试遇到了,可以这样回答:
(1)验证等防御代码过于繁琐,这一步本来在link阶段,现在却在计算时进行验证。
(2)产生很多临时对象,造成GC与计算时间消耗。
(3)由于缺少上下文,丢失了很多运行时的优化,比如JIT(它可以看作JVM的重要评测标准之一)
当然,我个人的看法是,现代JVM也不是非常慢了,它能够对反射代码进行缓存以及通过方法计数器同样实现JIT优化,所以反射不一定慢。更重要的是,很多情况下,你自己的代码才是限制程序的瓶颈。因此,在开发效率远大于运行效率的的基础上,大胆使用反射,放心开发吧。
文章转自:http://blog.csdn.net/xiaoxian8023/article/details/9206055
http://www.jianshu.com/p/f83556bcae59
Java技术——Java反射机制分析的更多相关文章
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- Java 反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- Java反射机制分析指南
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- Java中的反射机制和动态代理
一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...
- Java高级特性——反射机制(第二篇)
在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...
- 小白都能学会的Java注解与反射机制
前言 Java注解和反射是很基础的Java知识了,为何还要讲它呢?因为我在面试应聘者的过程中,发现不少面试者很少使用过注解和反射,甚至有人只能说出@Override这一个注解.我建议大家还是尽量能在开 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
随机推荐
- return void ajax
public class UserInfo { private String name; private Integer age; public String getName() { return n ...
- HTTP状态码完整版
HTTP 状态代码的完整列表 1xx(临时响应) 用于表示临时响应并需要请求者执行操作才能继续的状态代码. 代码 说明 100(继续) 请求者应当继续提出请求.服务器返回此代码则意味着,服务器已收 ...
- Android 网络提交数据(使用Asynchronous Http Client)
项目主页及简单使用方法http://loopj.com/android-async-http/ 页面布局就不复制了,把主要的Activity记录下来,供自己以后使用: package com.exam ...
- CSS filter 属性
filter 将模糊或者颜色偏移等图像效果用于元素,通常用于调整图像,背景和边框的渲染 css 标准中已内置一些预定义效果的函数,也可通过url使用SVG滤镜 语法 /* URL to SVG fil ...
- ZR#330. 【18 提高 3】矿石(容斥)
题意 题目链接 Sol 挺显然的,首先对每个矿排序 那么答案就是$2^x - 2^y$ $x$表示能覆盖到它的区间,$y$表示的是能覆盖到它且覆盖到上一个的区间 第一个可以差分维护 第二个直接vect ...
- Android仿360悬浮小球自定义view实现
转载请标明出处:http://www.jianshu.com/u/a5ad093cffe8 效果图如下: 图片.png 图片.png 实现当前这种类似的效果 (360小球 悬浮桌面差不错类似).第 ...
- POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
题意:有只奶牛要证明奶牛不笨,所以要带一些奶牛伙伴去证明自己.牛有智商和幽默感,两者可为负的(难在这),要求所有牛的智商和之 / 幽默感之和都不为负.求两者之和的最大值. 思路:每只牛可以带或不带上, ...
- lastlog命令
lastlog——检查某特定用户上次登录的时间 命令所在路径:/usr/bin/lastlog 示例1: # lastlog 列出所有用户,并显示用户最后一次登录的时间等信息 示例2: # lastl ...
- 修改字体篇:css3@font-face@字体转换@浏览器字体支持
@font-face { font-family: 'MyWebFont'; src: url('webfont.eot'); /* IE9 Compat Modes */ src: url('web ...
- db2新添用户
--1.新添用户 -目录 /XX/XX -组 XX 用户名useradd -d /home/xx -g users xx--2.修改密码passwd xx--3.在QC中grant权限.新添表空 ...