java语言区别于C,C++等准静态语言的最大特点就是java的反射机制。静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,Java不是动态语言。虽然在这样的定义下java不是动态语言,但java的反射机制(Reflection)却是可实现动态的相关机制。java反射机制的作用有

1、在运行时判断任意一个类所具有的成员变量和方法

2、在运行时构造任意一个类的对象

3、在运行时判断任意一个对象所属的类

4、在运行时调用任意一个对象的方法

在java的jdk中,有java.lang.reflect包,在该包中有5个比较重要的类,

1、Class类:代表一个类。

2、Constructor类:表示类的构造方法,通过该类来操作构造方法

3、Field类:代表类的成员变量(属性)。

4、Method类:代表类的方法。通过该类可操作方法。

5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

Class 类十分特殊。它和一般类一样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。Class并没有构造方法,不能人为生成。
 
要想使用java的反射,首先要获得类的Class,而获得的方法有以下几种
String str = "CIACs";
1、Class c1 = str.getClass();
2、Class c2 = Class.forName("java.lang.String");//调用Class的静态方法
3、Class c3 = String.class;//每个包装类都有自身的class
 
获得Class后,就可以生成对象了,对象的构造方法有带参数的和不带参数的,当通过不带参数的构造方法来生成对象时有以下两种方式
1、通过newInstance()方法生成
Class<?> classType = str.getClass();
 Object obj = classType.newInstance();
2、通过构造方法实现
Class<?> classType = str.getClass();
Constructor con = classType.getConstructor(new Class[]{});
Object obj = con.newInstance(new Object[]{});
 
若要通过带参数的构造方法生成对象实例,就只能使用如下方法
Class<?> classType = str.getClass();
Constructor con = classType.getConstructor(new Class[]{String.class});
Object obj = con.newInstance(new Object[]{"CIACs"});
 
获得类的对象实例后就可以操作对象的方法和属性了。以下是一个例子
 package reflection;

 import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class TestClass { public int add(int a,int b)
{
return a+b;
} public String echo(String str)
{
return str;
} public static void main(String[] args) throws Exception {
Class<?> classType = TestClass.class;//获得Class Object Test = classType.newInstance();//通过classType获得对象实例 Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});//运行中获得add方法 Object result = addMethod.invoke(Test, new Object[]{1,2});//传入参数调用add方法 System.out.println((Integer)result); Method echoMethod = classType.getMethod("echo",new Class[]{String.class}); Object result2 = echoMethod.invoke(Test, new Object[]{"http://www.cnblogs.com/zhi-hao/"}); System.out.println(result2); } }

TestClass

运行结果:
 
java反射甚至可以通过压制java的访问控制,改变私有的成员变量。
 
java学习中反射机制跟动态代理相关,动态代理也是java中的重要知识。
 

java学习之反射机制的更多相关文章

  1. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  2. Java学习:反射机制简介

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  3. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  4. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  5. JAVA 学习笔记 - 反射机制

    1.   JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...

  6. Java学习笔记-反射机制

    Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...

  7. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  8. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  9. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

随机推荐

  1. (DT系列三)系统启动时, dts 是怎么被加载的

    一,主要问题:系统在启动的时候,是怎么加载 dts的:Lk,kernel中都应调查. 二:参考文字dts加载流程如下图所示: 启动过程中,bootloader(默认是bootable/bootload ...

  2. JAVA--对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制. 1.对象的锁 所有对象都自动含有单一的锁. JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁 ...

  3. Clojure学习资料

    以下大部分收藏自博客:http://blog.csdn.net/ithomer/article/details/17225813 官方文档: http://clojure.org/documentat ...

  4. 《Effective C++》学习笔记条款13 以对象管理资源

    条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ... ...

  5. Java 8 新特性概述

    Oracle 在 2014 年 3 月发布了 Java 8 正式版,该版本是一个有重大改变的版本,对 JAVA 带来了诸多新特性.其中主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作 ...

  6. Microsoft SyncToy 文件同步工具

    Microsoft SyncToy SyncToy 是由 微软 推出的一款免费的文件夹同步工具.虽然名字中有一个 Toy,但是大家可千万不要误以为它的功能弱爆了.实际上,我感觉这款软件还真是摆脱了微软 ...

  7. GestureDetector封装手势检測上下滑动

    项目中须要检測ListView的上滑下滑隐藏顶部View控件,之前在网上也有非常多实现案例.在git上发现个封装非常不错的样例,记录下来. GestureDetector是一个手势检測类,内部有个Si ...

  8. 统计学习导论:基于R应用——第三章习题

    第三章习题 部分证明题未给出答案 1. 表3.4中,零假设是指三种形式的广告对TV的销量没什么影响.而电视广告和收音机广告的P值小说明,原假设是错的,也就是电视广告和收音机广告均对TV的销量有影响:报 ...

  9. POJ 1185 炮兵

    是中国标题.大家都说水问题.但是,良好的1A它? 标题效果: 给出n*m的矩阵,当某个单元格有炮兵部队时它的上下左右两格(不包含斜着的方向)是这支部队的攻击范围.问在两支部队之间不可能相互攻击到的情况 ...

  10. C++之枚举

    1. 声明枚举类型格式 enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6 enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;We ...