是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

动态获取类中信息,就是java反射 。可以理解为对类的解剖。

反射机制图解说明:

先创建一个字节码文件:

public class Person {

    private int age;
private String name; public Person(String name,int age) {
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......");
}
}

要想要对字节码文件进行解剖,必须要有字节码文件对象.如何获取字节码文件对象呢

获取字节码对象的第一种方式:Object类中的getClass()方法的。

import com.itfd.fanshe.Person;

public class ReflectDemo {
public static void main(String[] args) {
getClassObject();
}   public static void getClassObject(){ Person p = new Person();
Class clazz = p.getClass(); Person p1 = new Person();
Class clazz1 = p1.getClass(); System.out.println(clazz==clazz1);
}
}

想要用这种方式,必须要明确具体的类,并创建对象。比较麻烦 .

获取字节码对象的第二种方式:任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。

import com.itfd.fanshe.Person;

public class ReflectDemo {
public static void main(String[] args) {
getClassObject();
} public static void getClassObject() { Class clazz = Person.class; Class clazz1 = Person.class;
System.out.println(clazz==clazz1);
}
}

相对简单,但是还是要明确用到类中的静态成员。这种方式还是不够扩展。

获取字节码对象的第三种方式:只要通过给定的类的 字符串名称就可以获取该类,更为扩展。可是用Class类中的方法完成。该方法就是forName.

public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
getClassObject();
} public static void getClassObject() throws ClassNotFoundException { String className = "com.itfd.fanshe.Person"; Class clazz = Class.forName(className); System.out.println(clazz);
}
}

这种方式只要有名称即可,更为方便,扩展性更强。

JAVA反射机制_获取字节码文件对象的更多相关文章

  1. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  2. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  3. java中三种方式获得类的字节码文件对象

    package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(St ...

  4. Java反射机制能够获取的信息,与应用

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

  5. Java反射机制二 获取方法的返回值或参数的泛型信息

    在使用反射机制时,我们经常需要知道方法的参数和返回值类型,很简单  ,下面上示例,示例中的两个方法非常相似 package deadLockThread; import java.lang.refle ...

  6. 通过java反射机制,获取对象的属性和值(包括所有继承的父类)

    java的反射机制提供了两种方法: getDeclaredFields() :该方法能获取到本类的所有属性,包括private,protected和public,但不能获取到继承的父类的属性. get ...

  7. JAVA反射机制教程-获取类对象

    1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...

  8. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  9. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...

随机推荐

  1. Jquery 基本动画

    1.三组基本的动画 显示:show .隐藏hide.滑入:slideUp.滑出:slideDown.滑入滑出切换:slideTpggle.淡入:fadeIn.淡出:fadeOut.淡入淡出切换:fad ...

  2. [android] fragment的动态创建

    在一个商业软件中,会有很多的界面,如果没一个界面对应一个activity,那么activity会非常的多,清单文件也会非常的乱,谷歌在android3.0以后引入了新的概念叫fragment frag ...

  3. IDEA Tomcat Web项目修改了代码,重新部署页面没改变

    今天被IDEA坑的不浅直接说一下问题: 这是html页面不管我怎么修改重启服务器在浏览器中还是一点都不变化,甚至把一些内容都删了都没有变化,target可执行文件是最新的没问题,找了点资料发现是浏览器 ...

  4. 理解Java之IO流

    流是一种抽象概念,它代表了数据的无结构化传递.用来进行输入输出操作的流就称为IO流. 一.IO流结构 1.流的分类方式 按流向分: 从文件/网络/内存等(数据源)到程序是输入流:从程序到文件/网络/内 ...

  5. C++ 中std::function 、std::bind的使用和lambda的使用

    std::function是可调用对象的包装器:std::bind是将可点用对象和其参数一起进行绑定,且绑定后的结果可以使用std::function对象进行保存,并延迟调用到需要调用的时候: 在C+ ...

  6. Mac安装Vue-cli时 提示bash: vue: command not found问题

    1:   首先执行sudo npm install --global vue-cli 2: 复制的路径地址为添加环境变量的地址 3:添加环境变量   export PATH="$PATH:( ...

  7. Vue: 生命周期, VueRouter

    Vue实例的生命周期: beforeCreate:   实例创建之前除标签外,所有的vue实例需要的数据,事件都不存在 created:  实例被创建之后,data和事件已经被解析到,el还没有找到 ...

  8. CentOS 7开启防火墙端口

    1.开启防火墙 systemctl start firewalld 2.添加 firewall-cmd --zone=public --add-port=80/tcp --permanent 3.重新 ...

  9. 使用PHPExcel实现数据批量导入到数据库

    此例子只使用execel2003的.xls文档,若使用的是其他版本,可以保存格式为“Execel 97-2003 工作簿(*.xls)”即.xls文件类型即可! 功能说明:只能上传Excel2003类 ...

  10. js-JavaScript实现数字的千位分隔符

    function thousandSeparator(num) { return num && (num .toString().indexOf('.') != -1 ? num.to ...