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

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

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

Person.java

public class Person {
private int age;
private String name; public Person(int age, String name) {
super();
this.age = age;
this.name = name; System.out.println("Person param run..." + this.name + ":" + this.age);
} public Person() {
super(); System.out.println("person run");
} public void show() {
System.out.println(name + "...show run..." + age);
} private void privateMethod() {
System.out.println("method run");
} public void paramMethod(String str, int num) {
System.out.println("paramMethod run..." + str + ":" + num);
} public static void staticMethod() {
System.out.println("static method run...");
}
}

ReflectDemo.java

public class ReflectDemo {

	/**
* @param args
*/
// 要想要对字节码文件进行解剖,必须要有字节码文件对象。 public static void main(String[] args) throws ClassNotFoundException {
getClassObject_1();
System.out.println("-------------------- ");
getClassObject_2();
System.out.println("-------------------- ");
getClassObject_3();
} /*
*
* 获取字节码对象的方式:
*
* 方式一:Object类中的getClass()方法的。
*
* 想要用这种方式,必须要明确具体的类,并创建对象。
*
* 麻烦。
*/ public static void getClassObject_1() { Person p = new Person();
Class clazz = p.getClass(); Person p1 = new Person();
Class clazz1 = p1.getClass(); System.out.println(clazz == clazz1);
} /*
*
* 方式二:任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。 相对简单,但是还是要明确用到类中的静态成员。 还是不够扩展。
*/ public static void getClassObject_2() { Class clazz = Person.class; Class clazz1 = Person.class; System.out.println(clazz == clazz1); } /*
*
* 方式三:只要通过给定的类的字符串名称就可以获取该类,更为扩展。 可以用Class类中的方法完成。
*
* 该方法就是forName。
*
* 这种方法只要有名称即可,更为方便,扩展性更强。
*/ public static void getClassObject_3() throws ClassNotFoundException { // 可以把类的字符串名称写到配置文件中,然后读取出来。
String className = "Person";
Class clazz = Class.forName(className); System.out.println(clazz); } }

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. ASP.NET MVC下Ajax.BeginForm方式无刷新提交表单

    有时候,不得不考虑到以下场景问题: 数据库表字段会频繁更改扩展,而流行的重业务的js框架过于依赖json数据接口,导致的问题是,数据库表更改 -> 数据接口更改 -> 前段框架逻辑更改.. ...

  2. Android开发学习笔记-实现联网检测程序版本

    package com.frank.mobilesafe; import java.io.InputStream; import java.net.HttpURLConnection; import ...

  3. 超分辨率论文CVPR-Kai Zhang

    深度学习与传统方法结合的超分辨率:Kai Zhang 1. (CVPR, 2019) Deep Plug-and-Play Super-Resolution for Arbitrary https:/ ...

  4. QT编译错误:undefined reference to `__imp_gl*'等等

    学习QT OpenGL绘制图形,程序中使用了OpenGL的API函数(gl开头),但是编译出现了错误:截图如下 有过编程经验的人可知,是链接的时候出错,找不到函数的实现! 解决方法:在工程*.pro文 ...

  5. centos6.8 安装Python2.7后, yum出现“No module named yum”错误

    出现yum错误:No module named yum 解决方法,查看 /usr/bin下python有哪几个版本 ll /usr/bin 我这里是:2.6  和  2.7 (刚安装的) 由于yum命 ...

  6. 系统安装SQL Sever2000后1433端口未开放,如何打开1433端口的解决方法

    这篇文章主要针对Win2003系统安装SQL Sever2000后1433端口未开放,如何打开1433端口的解决方法. 用了几年的Windows2003和SQL Server2000了,不过这个问题倒 ...

  7. Matlab 随机数字

    1.随机生成仅仅有0.1元素的矩阵(m行n列) A=round(rand(m,n)) 2.随机生成每行有若干个0,1元素的矩阵,比方每行仅仅有2个元素为1,其它元素为0 A=zeros(4,5) fo ...

  8. 安装eclipse,配置tomcat

    1.去官网(https://www.eclipse.org/downloads/download.php?file=/oomph/epp/oxygen/R/eclipse-inst-win64.exe ...

  9. SpringBoot(十)-- 整合MyBatis

    1.pom.xml 配置maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...

  10. C++程序中调用其他exe可执行文件方法

    在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...