谈一谈java里面的反射机制
首先来看看百度百科中是如何定义的:
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里面的反射机制的更多相关文章
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 黑马程序员——【Java高新技术】——反射机制
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...
- Java 中的反射机制
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- JAVA类型信息——反射机制
JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java学习之反射机制
java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...
- java基础之反射机制
一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- 深入理解Java中的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
随机推荐
- spring cloud 声明式rest客户端feign调用远程http服务
在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.Feign就是Spring Cloud提供的一种声明式R ...
- 眼底血管分割训练函数(SVM,Adaboost)
# -*- coding: utf-8 -*- import numpy as np from sklearn import svm from sklearn.model_selection impo ...
- 步步为营-104-Lambda语句
1:Lambda的拼接 首先借助一个Lambda的帮助类 using System; using System.Collections.Generic; using System.Linq; usin ...
- Spring Boot学习--项目启动时执行指定service的指定方法
Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方 ...
- Aws云服务EMR使用
Aws云服务EMR使用 创建表结构 创建abc库下的abc_user_i表字段s3://abc-server/abc-emr/shell/ABC_USER_HIVE.q: EXTERNAL 指定为外部 ...
- RabbitMq相关运维
# 命令查询所有用户列表rabbitmqctl list_users # 使用命令对 xiandian-admin 用户进行授权set_permissions xiandian-admin '.*' ...
- DapperHelper 帮助类
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- openCV 备忘
yum install python-devel numpy cmake gcc gcc-c++yum install gtk2-devel libdc1394-devel libv4l-devel ...
- kickstart-E
A题 简答模拟题 #include <iostream> #include<stdio.h> #include <set> #include <algorit ...
- centos的基本操作
1.ssh连接阿里云一段时间不操作自动断开打开/etc/ssh/sshd_config添加或修改: ClientAliveInterval 120ClientAliveCountMax 0 2.挂载数 ...