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

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

静态语言

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

动态语言

  动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。并且动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。

  这时可能你就会有疑问了,既然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();System.out.println("获取私有构造方法,并调用");con=clas.getDeclaredConstructor(char.class);System.out.println(con);//con.setAccessible(true);//暴力访问,针对private方法和字段时使用obj=con.newInstance('a');//创建对象
}

}
复制代码
输出

复制代码
所有公有构造方法
public first.Student(char)
public first.Student()
public first.Student(java.lang.String,int)
所有的构造方法
protected first.Student(boolean)
private first.Student(int)
public first.Student(char)
public first.Student()
first.Student(java.lang.String)
public first.Student(java.lang.String,int)
获取公有无参的构造方法
con=public first.Student()
调用了公有、无参构造方法执行了。。。
获取私有构造方法,并调用
public first.Student(char)
姓名:a
复制代码
Fields.java(字段)

复制代码
package first;

import java.lang.reflect.Field;

public class Fields {

public static void main(String[] args)throws Exception {// TODO Auto-generated method stubClass StuClass=Class.forName("first.Student");System.out.println("获取所有公有的字段");Field[] fieldArry=StuClass.getFields();for(Field f:fieldArry) {System.out.println(f);}System.out.println("获取所有的字段(包括私有、受保护、默认的)");fieldArry=StuClass.getDeclaredFields();for(Field f:fieldArry) {System.out.println(f);}System.out.println("获取公有字段并调用");Field f = StuClass.getField("name");System.out.println(f);Object obj=StuClass.getConstructor().newInstance();StuClass.getConstructor(String.class,int.class).newInstance("a",10);f.set(obj, "b");Student stu=(Student)obj;System.out.println(stu.name);System.out.println("获取私有字段并调用");f = StuClass.getDeclaredField("phoneNum");System.out.println(f);f.setAccessible(true);//暴力反射,解除私有限定f.set(obj, "18888889999");System.out.println("验证电话:" + stu);
}

}
复制代码
输出

复制代码
获取所有公有的字段
public java.lang.String first.Student.name
获取所有的字段(包括私有、受保护、默认的)
public java.lang.String first.Student.name
protected int first.Student.age
char first.Student.sex
private java.lang.String first.Student.phoneNum
获取公有字段并调用
public java.lang.String first.Student.name
调用了公有、无参构造方法执行了。。。
姓名:a年龄:10
b
获取私有字段并调用
private java.lang.String first.Student.phoneNum
验证电话:Student [name=b, age=0, sex=
复制代码
Main.java

复制代码
package first;

import java.lang.reflect.Method;

public class Main {
public static void main(String[] args) {
try {
// 1、获取Student对象的字节码
Class clazz = Class.forName("first.Student");

        // 2、获取main方法Method methodMain = clazz.getMethod("main", String[].class);// 第一个参数:方法名称,第二个参数:方法形参的类型,// 3、调用main方法// methodMain.invoke(null, new String[]{"a","b","c"});// 第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组// 这里拆的时候将 new String[]{"a","b","c"} 拆成3个对象。。。所以需要将它强转。methodMain.invoke(null, (Object) new String[] {});// 方式一// methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二} catch (Exception e) {e.printStackTrace();}
}

}

转载于:https://blog.51cto.com/13954634/2177336

Java动态性之反射机制(reflection)相关推荐

  1. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  2. Java反序列化之反射机制

    目录 前言 Java反射机制 反射机制方法 指定构造方法生成实例 执行私有方法 总结 前言 每次听到大佬在讲或者看论坛等一些方式学java反序列化漏洞时,都会有一个词叫做反射机制,大佬顺势借着这个词, ...

  3. 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等

    这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...

  4. JAVA基础--JAVA中的反射机制详解

    JAVA反射机制     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...

  5. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  6. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

  7. 根据实例详解Java中的反射机制

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

  8. Java语言基础-反射机制、正则表达式

    反射机制 反射机制是在运行状态中,对于任意一个类,都能知道这个类(class文件)的所有属性和方法. 对于任意一个对象,都能调用它的任意一个方法和属性. 这种动态获取信息以及动态调用对象的方法的功能称 ...

  9. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

最新文章

  1. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
  2. C#与matlab混合编程
  3. sudo chown -R $(whoami) /usr/local/lib/pkgconfig
  4. Java创建线程的三种方法
  5. cas client 更新ticket_cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错...
  6. OSChina 周六乱弹 ——属于程序员的情话
  7. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  8. bboss v5.5.3 发布,Elasticsearch Rest Client
  9. LIVE2D模型加载软件Live2DViewerEX(steam),LIVE2Dviewer(LIVED2D社区),LIVE2Dviewer(github),Ppet(github)让你的老婆活灵活现
  10. python类使用异步_异步Python类
  11. Topic 1. SCI 文章中 Meta 分析之 metafor
  12. 线性规划——单纯形法
  13. Linux驱动——编译驱动的两种形式(内核目录外、内核目录中)
  14. [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
  15. 7、机器视觉之色彩空间转换
  16. pvr.ccz文件转png方法
  17. 使用shell比较两个文本的差异
  18. Linux内核分析 笔记七 可执行程序的装载 ——by王玥
  19. 机器学习(Machine Learning)深度学习(Deep Learning)资料【转】
  20. vue 后台获取路由表,addRouters动态路由

热门文章

  1. 储能逆变器防逆流检测解决方案
  2. Xcode 10 的错误: Multiple commands produce
  3. Http Server, Web Server和App Server 的区别
  4. 微服务下统一管理配置swagger
  5. Android悬浮窗滤镜,屏幕滤镜(PWM防闪烁)
  6. OcenAudio for Mac(好用的音频编辑软件)
  7. 发票扫描识别,发票扫描仪
  8. 西北工业大学 计算机学院 姜,姜保庆-计算机与信息工程学院官网
  9. 【Spark 调优】Spark 开发调优的十大原则
  10. 17届全国大学生智能汽车竞赛 中国石油大学(华东)智能视觉组 --模型训练篇