JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。动态获取类中信息,就是java反射。可以理解为对类的解剖。

如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术。所谓的框架就是对外提供一些接口,也就是功能扩展的标准,由实现类按照这个接口标准去实现。框架内部如果需要操纵这些实现类的对象完成某些操作,那么只需要把这些实现类的全名(包名+类名)写在某个配置文件中,框架代码只需要读取这个配置文件,就可以获取这个实现类的字节码文件,然后利 用反射技术创建这个实现类的对象并且调用相应的方法完成一些操作。用于描述字节码的类就是Class类,创建对象,可以提取字节码文件中的内容,如字段、构造函数、一
般函数。该类就可以获取字节码文件中的所有内容,那么反射就是依靠该类完成的。想要对一个类文件进行解剖,只要获取到该类的字节码文件对象即可。

 示例:获取字节码文件对象的3种方式

Person.java

  1. public class Person {
  2. private int age;
  3. private String name;
  4.  
  5. public Person(int age, String name) {
  6. super();
  7. this.age = age;
  8. this.name = name;
  9.  
  10. System.out.println("Person param run..." + this.name + ":" + this.age);
  11. }
  12.  
  13. public Person() {
  14. super();
  15.  
  16. System.out.println("person run");
  17. }
  18.  
  19. public void show() {
  20. System.out.println(name + "...show run..." + age);
  21. }
  22.  
  23. private void privateMethod() {
  24. System.out.println("method run");
  25. }
  26.  
  27. public void paramMethod(String str, int num) {
  28. System.out.println("paramMethod run..." + str + ":" + num);
  29. }
  30.  
  31. public static void staticMethod() {
  32. System.out.println("static method run...");
  33. }
  34. }

ReflectDemo.java

  1. public class ReflectDemo {
  2.  
  3. /**
  4. * @param args
  5. */
  6. // 要想要对字节码文件进行解剖,必须要有字节码文件对象。
  7.  
  8. public static void main(String[] args) throws ClassNotFoundException {
  9. getClassObject_1();
  10. System.out.println("-------------------- ");
  11. getClassObject_2();
  12. System.out.println("-------------------- ");
  13. getClassObject_3();
  14. }
  15.  
  16. /*
  17. *
  18. * 获取字节码对象的方式:
  19. *
  20. * 方式一:Object类中的getClass()方法的。
  21. *
  22. * 想要用这种方式,必须要明确具体的类,并创建对象。
  23. *
  24. * 麻烦。
  25. */
  26.  
  27. public static void getClassObject_1() {
  28.  
  29. Person p = new Person();
  30. Class clazz = p.getClass();
  31.  
  32. Person p1 = new Person();
  33. Class clazz1 = p1.getClass();
  34.  
  35. System.out.println(clazz == clazz1);
  36. }
  37.  
  38. /*
  39. *
  40. * 方式二:任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。 相对简单,但是还是要明确用到类中的静态成员。 还是不够扩展。
  41. */
  42.  
  43. public static void getClassObject_2() {
  44.  
  45. Class clazz = Person.class;
  46.  
  47. Class clazz1 = Person.class;
  48.  
  49. System.out.println(clazz == clazz1);
  50.  
  51. }
  52.  
  53. /*
  54. *
  55. * 方式三:只要通过给定的类的字符串名称就可以获取该类,更为扩展。 可以用Class类中的方法完成。
  56. *
  57. * 该方法就是forName。
  58. *
  59. * 这种方法只要有名称即可,更为方便,扩展性更强。
  60. */
  61.  
  62. public static void getClassObject_3() throws ClassNotFoundException {
  63.  
  64. // 可以把类的字符串名称写到配置文件中,然后读取出来。
  65. String className = "Person";
  66. Class clazz = Class.forName(className);
  67.  
  68. System.out.println(clazz);
  69.  
  70. }
  71.  
  72. }

Java反射机制获取Class文件的更多相关文章

  1. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  2. 1个比较简单的使用java反射机制获取前台数据进行数据封装的例子

    //利用反射机制 和 从request获取所有参数的形式来构建查询对象 CustomerChooseSearchParma searchObject = new CustomerChooseSearc ...

  3. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  4. 通过java反射机制获取该类的所有属性类型、值

    转自:http://blog.csdn.net/sd4000784/article/details/7448221 方法使用了这俩个包下的 field 和method import Java.lang ...

  5. 运用java反射机制获取实体方法报错,java.lang.NoSuchMethodException: int.<init>(java.lang.String)

    错误的原因是我的Student实体,成员变量数据类型,使用了int基本数据类型,改成Integer包装类型即可.

  6. kettle job如何利用java的反射机制获取执行的sql语句

    kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...

  7. Java反射机制Reflection

    Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...

  8. android 利用反射机制获取drawable中所有的图片资源

    public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...

  9. Java反射机制--笔记

    1.认识Class类 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式. /*java 反射机制*/ // 获取类的方法 UserDao userDao = new UserDao() ...

随机推荐

  1. 如何能延长windows server 2008 R2激活期 .

    当windows server 2008 R2使用已经到期的时候,要求激活,我们可以通过以下命令,延长激活期. 在运行中输入:slmgr.vbs -rearm 重新启动windows server 2 ...

  2. Java编程思想学习笔记——类型信息

    前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...

  3. lua封装的位运算

    1.移位运算基础 --与 同为1,则为1 --或 有一个为1,则为1 --非 true为 false,其余为true --异或 相同为0,不同为1 --ZZMathBit = {} function ...

  4. Github上搭建个人博客记录

    1.注册,用户名一定要起好,别随便起. 2.登录后,新建一个仓库repositories.new一个. 命名为用户名.github.io.如果发现不一样进Settings修改,rename. 3.仓库 ...

  5. c语言中左移、右移中的高位需要注意

    有符号数,左移可能会破坏符号位. 右移时,要注意高位符号. 0X表示十六进制.十六进制每位数值由 0-f表示.所以0XC0 对应 二进制为 11000000B10进制与16进制间关系:1 -- 0X1 ...

  6. 8 -- 深入使用Spring -- 4...4 Spring 的 AOP 支持

    8.4.4 Spring 的AOP 支持 Spring中的AOP代理由Spring的IoC容器负责生成.管理,器依赖关系也由IoC容器负责管理.因此,AOP代理可以直接使用容器中的其他Bean实例作为 ...

  7. centos 7 安装 gcc-4.9.3.tar.gz

    由于编译新内核需要,更新了GCC编译器,自行获取文件,手动升级. 首先是获取文件:wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gc ...

  8. iOS开发--tarBarItem右上方显示badgeValue

    直接设置tabBarItem.badgeValue没有效果,找原因半天发现ViewController被NavigationViewController包着 需这样设置才行: self.navigat ...

  9. Splash resource_timeout 属性

    resource_timeout属性用于设置加载的超时时间,单位是秒,如果设置为 0 代表不检测超时,如下,设置超时时间为 0.1 秒: function main(splash) splash.re ...

  10. U3D教程宝典之两步实现超实用的XML存档

    两步实现超实用的XML存档 本套存档的优点:易使用,跨平台,防作弊(内容加密 + 防拷贝) 脚本下载地址 使用方法非常简单:把GameDataManager和XmlSaver两个脚本添加至工程后(1) ...