设为首页 加入收藏

TOP

Java动态性之反射机制(reflection)(一)
2018-10-10 04:10:50 】 浏览:295
Tags:Java 动态性 反射 机制 reflection

说到反射机制,第一次接触的人可能会比较懵,反射?什么反射?怎么反射?反射是干嘛的?下面我将在这篇文章中讲讲Java的反射机制


不过在这之前,还有一个问题需要解决,标题名中的动态性,说起动态性,我先介绍介绍动态语言和静态语言


静态语言


  静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 例如:C++、Java、Delphi、C#等。


动态语言


  这时可能你就会有疑问了,既然Java属于静态语言,又怎么会有动态性?其一就是Java存在与动态性相关的机制:反射机制。Java通过反射机制,可以在程序运行时加载,探知和使用编译期间完全未知的类,并且可以生成相关类对象实例,从而可以调用其方法或则改变某个属性值。所以JAVA也可以算得上是一个半动态的语言。


下面来讲讲反射机制


  反射机制概念
    在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。


  反射的原理在于Class对象


    看一看程序加载的过程


从图中大概可以看出反射是干什么用的了,那接下来就讲讲有关反射的其他方面


  反射的API


    反射API用来生成JVM中的类、接口或则对象的信息。
    - Class类:反射的核心类,可以获取类的属性,方法等信息。
    - Field类:Java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
    - Method类: Java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
    - Constructor类: Java.lang.reflec包中的类,表示类的构造方法。


下面就来讲讲怎么使用反射了  


1.步骤


获取想要操作的类的Class对象
调用Class类中的方法
使用反射API来操作这些信息
2.获取Class对象的方法



//假设我们有一个Student类
方法一、(推荐)
Class clas = Class.forName("first.Student");//“”里写的是类的全路径


方法二、
Student stu = new Student();
Class clas = stu.getClass();


方法三、
Class clas = Student.Class;



可以试试用两个不同的方法获取clas1和clas2,然后System.ou.println(clas1==clas2)看看会输出什么,原因在图上


3.获取构造方法、字段、main方法并调用


Student.java



public class Student {
public String name;
protected int age;
char sex;
private String phoneNum;


public static void main(String[] args) {


    System.out.println("main方法执行了。。。");


}
//---------------构造方法-------------------
Student(String str) {
    System.out.println("(默认)的构造方法 s = " + str);
}


// 无参构造方法
public Student() {
    System.out.println("调用了公有、无参构造方法执行了。。。");
}


// 有一个参数的构造方法
public Student(char name) {


    System.out.println("姓名:" + name);
}


// 有多个参数的构造方法
public Student(String name, int age) {
    this.name=name;this.age=age;
    System.out.println("姓名:" + name + "年龄:" + age);// 这的执行效率有问题,以后解决。
}


// 受保护的构造方法
protected Student(boolean n) {
    System.out.println("受保护的构造方法 n = " + n);
}


// 私有构造方法
private Student(int age) {
    System.out.println("私有的构造方法  年龄:" + age);
}


public String toString() {
    return "Student [name=" + name + ", age=" + age + ", sex=" + sex
            + ", phoneNum=" + phoneNum + "]";
}


}


Constructors.java(构造方法)



package first;


import java.lang.reflect.Constructor;


public class Constructors {
public static void main(String[] args) throws Exception {


    Class clas=Class.forName("first.Student");


    System.out.println("所有公有构造方法");
    Constructor[] conArry=clas.getConstructors();
    for(int i=0;i<conArry.length;i++) {
        System.out.println(conArry[i]);
    }


    System.out.println("所有的构造方法");
    conArry=clas.getDeclaredConstructors();
    for(int i=0;i<conArry.length;i++) {
        System.out.println(conArry[i]);
    }


    System.out.println("获取公有无参的构造方法");
    Constructor con=clas.getConstructor(null);
    System.out.println("con="+con);
    Object obj=con.newInstance();


    Syst

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java Bean与Map之间相互转化的实现 下一篇简化 Django 开发的八个 Python 包

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目