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. leecode Binary Tree Level Order Traversal II java

    做完这道题,只能说基本功很重要,数组中套数组就不会用了,过几天吧1做了,看自己到底等没. https://oj.leetcode.com/problems/binary-tree-level-orde ...

  2. python爬虫学习(3)_模拟登陆

    1.登陆超星慕课,chrome抓包,模拟header,提取表单隐藏元素构成params. 主要是验证码图片地址,在js中发现由js->new Date().getTime()时间戳动态生成url ...

  3. Yii AR Model CRUD数据库操作

    Yii AR很好很强大,但刚开始不知道怎么使用,可以先看下官方文档 官方文档:http://www.yiichina.com/guide/database.ar 下面是我对AR的一些理解 对于一个Mo ...

  4. 常用js效果:选项卡切换

    js选项卡,很多网站都会用到,我这里用jquery给整了一个简单但是却很实用的js选项卡,废话不多说,直接上代码: <style> .txtadsblk01{ width:200px;} ...

  5. PHP开发APP接口(一)

    php以json或者xml 形式返回给app.明白这点就很好说了,就是把数据包装成json或者xml,返回给APP 定义抽象APP基类: <?php /** * 定义API抽象类 */ abst ...

  6. ACMDP之最长公共子序列长度—HDU1159

    Common Subsequence Problem Description A subsequence of a given sequence is the given sequence with ...

  7. EasyUI-在行内进行表格的增删改操作

    第一篇笔记中记录了如何实现表格的增删改,那个是点击之后跳出来一个对话框然后进行的,这里是在表格本身上进行的操作,也很简单,但是这里发现一个版本问题,也可以说是兼容性问题. 1.首先我们看引用的js和c ...

  8. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  9. android 75 新闻列表页面

    new.xml <?xml version="1.0" encoding="UTF-8" ?> <newslist> <news& ...

  10. LabVIEW系列——合并错误(VI)的用法

    Merge Errors.vi的功能:1.按顺序搜索错误输入1,2,3,以及错误数组输入中的错误,输出第一个错误.                        2.如果没有错误,也就是错误状态都为F ...