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

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. Oracle logminer 日志挖掘

    Table of Contents 1. LOGMNR简介 2. 创建数据字典 2.1. 外部文件存储数据字典 2.2. redo log 存储数据字典 3. 添加需要分析的文件 4. 开始分析文件 ...

  2. ubuntu下使用matplotlib绘图无法显示中文label

    原因是字体导致的.大家的做法基本都是搞一个windows上的字体文件(simhei.ttf, 点我fq下载)然后刷新一下缓存文件. 只不过百度搜到第一篇CSDN的博客,写的很不靠谱(不是所有的CSDN ...

  3. Git推送错误Remote: User permission denied错误解决方法

    用了别的同事的电脑,推送代码,报错. 解决方法: 修改别人的密码,改成自己的账号和密码就可以了.

  4. python之 MySQLdb 实践 爬一爬号码

    0.目录 2.构建URL3.新建数据库4.新建汇总表5.定义连接数据库函数:connect_db(db=None, cursorclass=DictCursor)6.汇总表填充必要数据7.新建各省份子 ...

  5. Derive representation formula from Green’s identity

    This article introduces how to derive the representation formula used in BEM from Green's identity. ...

  6. 用groovy脚本进行每日工作的自动化【groovy】

    我们可以用groovy编写日常的批处理脚本,类似windows下的bat或者unix下的shell.其具体的编写方式非常简单,比如我们想要执行一个dir的命令,只要编写一个test.groovy,其中 ...

  7. C语言整理——文件系统和文件访问

    标准C中规定了文件系统的访问和对文件本身的访问.不管是windows系统或者是泛unix系统,都实现了这些接口.在了解这些知识后,跨平台编程也将非常容易. 对文件系统的访问接口有: chdrive() ...

  8. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  9. Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)

            一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...

  10. lvs介绍

    1Linux集群及系统扩展的方式概述 集群是有多台服务器组织在一起,一起工作,因为单台服务器的并发响应能力是有限的,响应处理能力也是有限的所有有了集群的出现 在系统扩展有2种方法: 1 向上扩展:是指 ...