`

(转)Class对象和Java反射机制

 
阅读更多
http://www.importnew.com/21235.html
一 前言

很多书上都说,在java的世界里,一切皆对象。其实从某种意义上说,在java中有两种对象:实例对象和Class对象。实例对象就是我们平常定义的一个类的实例:

1
2
3
4
5
6
/**
* Created by aristark on 3/28/16.
*/
public class Person {

}
然后利用new关键字:

1
2
3
4
5
public class Person {
    public static void main(String[] args){
        Person p = new Person();
    }
}
而Class对象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说,当我们定义好一个类文件并编译成.class字节码后,编译器同时为我们创建了一个Class对象并将它保存.class文件中。我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象。同时在jvm内部有一个类加载机制,即在需要的时候(懒加载)将.class文件和对应的Class对象加载到内存中。总之要有这样一个意识,Person.java文件编译成Person.class的同时也会产生一个对应的Class对象。

二 Class对象的获得

上面说了,Class对象是jvm用来保存对象实例对象的相关信息的,除此之外,我们完全可以把Class对象看成一般的实例对象,事实上所有的Class对象都是类Class的实例。得到一个实例对象对应的Class对象有以下三种方式:
1.通过实例变量的getClass()方法:

1
2
Dog dog = new Dog();
Class d = dog.getClass();
2.通过类Class的静态方法forName():

1
2
3
4
5
try {
           Class dog1 = Class.forName("Dog");
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
3.直接给出对象类文件的.class:

1
Class dog2 = Dog.class;
三 Class对象的使用和反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简而言之,我们可以从.class逆向到.java(反编译),我们可以通过反射机制来访问一个类java对象的属性,方法,甚至我们可以轻易改变一个私有成员,看代码,我们先来定义一个Cat类:


class Cat{
    public static int count;
    public int age;
    private String name;

    static {
        count = 0;
    }

    public Cat(){
        age = count++;
        System.out.println("this is class Cat!");

    }

    public void run(){

    }

    private void ruff(){}
}
注意到我们的类中包含静态成员,私有变量,静态初始化以及私有方法。这里在提一下所谓的懒加载:当Cat.java编译成Cat.class文件后并不会立即被加载到内存,而是在它的的静态成员第一次被访问时才被加载(这么看来,Cat的默认构造方法也是静态的!)


Class c = Cat.class;
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields){
            System.out.println(field);
        }
结果如下:


public static int Cat.count
public int Cat.age
private java.lang.String Cat.name
可以看到我们轻而易举的得到了Cat类的字段信息,再来:


Method[] methods = c.getDeclaredMethods();
        for (Method method : methods){
            System.out.println(method);
        }
结果如下 :

1
2
public void Cat.run()
private void Cat.ruff()
好玩吧,我们竟然可以在运行时得到类的信息。同时我们发现Cat类中的静态初始化代码段并没有执行。接下来我们通过Class对象来获得对应的实例对象:

try {
            Cat cat = (Cat) c.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
这时候静态代码块执行了:

1
this is class Cat!
接下来我们做一件神奇的事情:


try {
            Class catClass = Class.forName("Cat");
            Field name = catClass.getDeclaredField("name");
            name.setAccessible(true);
            Cat cat2 = (Cat) catClass.newInstance();
            name.set(cat2,"Aristark");
            System.out.println(cat2.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
这次我们使用Class.forname()来获取Class对象,它的作用是让jvm查找并加载指定的类,也就是说Cat类的静态代码块会被执行。其次值得注意的是,我们通过Class的几个方法访问了原本不可以被访问的name属性:


this is class Cat!
Aristark
从这个意义上来说,反射机制并不符合OOP的思想,所以我们仅在必要的时候使用这个特性就行了。

四 后记

理解好Class对象不仅能让我们更好的认识一切皆对象这个观点,对之后学习泛型,类型擦除都是很有帮助的,而对于java反射机制我们只需在适当的场合利用它即可。:)关于这两个知识的深入学习稍后我会贴出一些有借鉴意义的文章,大家要关注哦~
分享到:
评论

相关推荐

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java面试题--反射机制

    `Class`类在Java反射机制中扮演着核心角色,它是所有Java类的运行时表示。`Class`对象可以由以下几种方式获取: 1. **通过类的`Class`属性获取**:如`String.class`。 2. **通过对象的`getClass()`方法获取**:如`...

    Java反射机制 Java反射机制

    ### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。

    java反射机制 字符串——java对象

    总的来说,Java反射机制和字符串操作是Java开发中不可或缺的部分,它们允许我们实现动态编程,增强程序的灵活性和可扩展性。通过结合XML序列化和解析,我们可以方便地在Java对象和XML数据之间进行转换,这对于数据...

    JAVA反射机制应用

    在JAVA反射机制中,Class类和Field类、Method类、Constructor类是最重要的三个类,它们提供了访问类、字段、方法和构造函数的能力。 在获取某个对象的属性时,我们可以使用getField方法,例如: ```java public ...

    利用java反射将json字符串转成对象.zip

    在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON字符串转换为Java对象。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    应用java反射机制打印一个对象.docx

    Java 反射机制是 Java 语言中的一种强大工具,允许程序在运行时检查和修改对象的行为。下面我们将讨论如何使用 Java 反射机制来打印一个对象的所有属性值。 Java 反射机制的概念 Java 反射机制是指 Java 语言中的...

    java反射机制详解与应用.pdf

    Java 反射机制详解与应用 Java 反射机制是一种非常强大的动态相关机制,允许 Java...在 Java 程序中,Java 反射机制是非常重要的机制,它提供了非常强大的功能,可以帮助开发者快速地开发和维护复杂的 Java 应用程序。

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    Java反射机制的学习

    Java反射机制是Java编程语言中...总之,Java反射机制是Java语言灵活性的体现,它提供了一种强大的工具,允许程序员在运行时探索和操纵类和对象。但同时,也需注意其潜在的风险和性能影响,合理地在项目中应用反射技术。

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    JAVA反射机制和JDBC和各种数据库的连接

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这极大地增强了代码的灵活性...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。

Global site tag (gtag.js) - Google Analytics