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

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. linux上安装redis并使用

    1.下载:curl -O http://download.redis.io/releases/redis-4.0.6.tar.gz 2.在/usr/local/redis上解压:tar -zxvf r ...

  2. IDEA文件对比

  3. 下载中间件--随机IP代理以及随机User_Agent

    下载中间件随机IP代理以及随机User_Agent 1.在settings.py中设置开启代理功能 # 设置下载中间件 DOWNLOADER_MIDDLEWARES = { # 随机的 User-Ag ...

  4. nodejs 2017

    1.  nodejs函数 path()  nodejs全局变量 __dirname a.js // 运行 node a.js var path = require('path'); console.l ...

  5. POJ 3713 Transferring Sylla【Tarjan求割点】

    题意:给出一个无向图,判断是否任意两点间都存在至少3条互相独立的路,独立指公共顶点只有起点和终点.算法:枚举每个点,删去后用Tarjan判断图中是否存在割点,如果存在则该图不满足三连通性.Tarjan ...

  6. 【AtCoder】ExaWizards 2019

    ExaWizards 2019 C - Snuke the Wizard 发现符文的相对位置不变,直接二分某个位置是否到达最左或最右来计算 #include <bits/stdc++.h> ...

  7. Python_xml

    xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议) ET(xml.etree.ElementTree)中的几个类: ...

  8. http账户密码的截取

    首先,http的前提也是基于arp欺骗的,当arp欺骗成功后,方可进行. 具体步骤如下: 1.打开终端,先进行流量的转发:echo  1  >/proc/sys/net/ipv4/ip_forw ...

  9. keepalived + glusterfs实现高可用

    此处暂时不介绍原理乱七八糟,边做别记录下操作. 1.服务器修改网卡的名字为eth0 .将device和name都改成eth0 vim /etc/sysconfig/network-scripts/if ...

  10. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...