首先来看看百度百科中是如何定义的:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
通俗点将就是通过反射机制可以查看类中的所有内容(属性、构造方法、普通方法)。
首先来说说为什么用这个反射机制,再说怎么实现。
一个已经发布了的应用程序,如何对他进行更改,为了保证安全,他的源码肯定不会告诉你,只会给你提供一个接口,让你写一个类去实现它,然后
呢?你写的更改信息如何让应用程序知道呢,你没办法直接让应用程序创建这个类的对象,这时候就会用到配置文件,你把你的类名写到配置文件当中
应用程序就会利用反射机制只通过这个类名就能够知道这个类中你写的内容。比如Tomcat服务器,这也是一个应用程序,他的作用是接收请求和处理请求

如果你想定义自己的接收处理方式,他提供了一个Servlet接口给你,你实现了这个接口,然后把这个类名放到Tomcat的配置文件web.xml中,Tomcat
就会利用反射机制来获取内容。
 
那该怎么解释呢?
我们都知道一个java程序想要运行,首先要进行早期编译器的编译生成class文件,虚拟机然后要加载这个class文件到方法区中,在类加载过程中会
产生一个Class类,这个Class类就是反射机制的源头,如果你想查看任意一个类的属性和方法,都得先生成一个Class对象,万物皆对象,Class类就是class
文件的抽象,

但是Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
那Class对象如何和类关联呢?
有三种方式:
1.通过类名.class;
2.通过对象名.getClass();
3.通过类加载驱动class.forName(完整类名(带有完整包路径的名))。
创建对象以后,就可以查看类中的内容。
public class Person{

//属性
private String name;
private int age;
//构造方法
public Person(){}
public Person(String name;int age){
this.name=name;
this.age=age;
}
//普通方法
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age=age;
} }

在Class类中,

①属性有一个自己的名称叫做Field;

②构造方法叫做Constructor;

③普通方法叫做Method;

针对属性的操作

 第一步首先要获得Class对象。以Person为例
 Class clazz1=Person.class;
Class clazz2=new Person().getClass();
Class clazz3=Class.forName(com.in.Person);
第二部要得到Field对象
// 获取公有的属性的Field对象
Filed s=clazz.getField(name);
//获取本类的属性,但包括私有属性的Field对象
Field s=clazz.getDeclaredField("age");

第三步获取获取或修改属性的值

属性需要通过对象来获取

Object obj=clazz.newInstance();
//设置可以获取私有属性的值
s.setAccessible(true);
System.out.println(s.get(obj));
针对构造方法的操作

通过无参构造方法创建对象可以直接用
Class clazz=Class.forName("com.in.Person");

如果想要有参构造方法呢?

         Class clazz=Class.forName("com.in.Person");
//得到Constructor对象,把参数类型传进去
Constructor constructor=clazz.getConstructor(String.class,int.class);
//这样就等同于 Person p=new Person("小明",33);
Object obj=constructor.newInstance("小明",);

操作普通方法

      

    Class clazz=Class.forName("com.in.Person");
//没有参数的普通方法
Method method1=clazz.getMethod("noNum", null);
Object obj=clazz.newInstance();
method1.invoke(obj, null);
//有参数的普通方法
Method method2=clazz.getMethod("hasNum", int.class);
method2.invoke(obj, );

												

谈一谈java里面的反射机制的更多相关文章

  1. java中的反射机制在Android开发中的用处

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

  2. 黑马程序员——【Java高新技术】——反射机制

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...

  3. Java 中的反射机制

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

  4. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  5. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

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

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

  7. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  8. java基础之反射机制

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

  9. 深入理解Java中的反射机制

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

随机推荐

  1. C#的值传递与引用传递

    值传递:在使用值传递时,是把变量的值传给函数,函数中对此变量的任何修改都不影响该变量本身的值. 引用传递:使用引用传递时,在函数中对此变量的修改会影响变量的值. 说简单点,值传递,就是我把身份证复印件 ...

  2. 005-2-Python文件操作

    Python文件操作(file) 文件操作的步骤: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件(操作文件后记住关闭) 1.读写文件的基础语法: open() 将会返回一个 ...

  3. 主流前端框架对比:Vue.js , React, Angular.js

    个人认为Vue.js的文档最恳切.我认为结合文档和遇到问题Google答案的匹配度来讲:Vue.js > ReactJS > AngularJS > Angular 2 如何使用Vu ...

  4. shell 写的 jrottenberg/ffmpeg 转码

    #!/bin/bash ];then echo "The argument must be 2" exit; else echo "$1 $2" fi VIDE ...

  5. 将Elasticsearch的快照备份到HDFS

    1.安装Elasticsearch插件repository-hdfs 下载地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins ...

  6. angular 4 开发环境下打包文件过大

    angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...

  7. C#操作windows服务

    本文主要说明了Windows服务的安装.卸载.启动.停止.获取服务安装路径.获取服务状态.检查服务是否存在.获取服务版本. 我们需要引用命名空间using System.Configuration.I ...

  8. IO流-file

    1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把 ...

  9. C# 之 下载EXCEL文件,自动用迅雷下载aspx

    在浏览器中导出 Excel 得时候,如果浏览器绑定了迅雷,则会下载aspx文件. 解决:下载EXCEL文件,自动用迅雷下载aspx if (Request.QueryString["id&q ...

  10. redis监控脚本

    while [ 1 == 1 ]  ; do   now=$(date "+%Y-%m-%d_%H:%M:%S")  ; echo "================== ...