文档章节

Java反射机制

javaART
 javaART
发布于 2017/09/03 21:01
字数 719
阅读 6
收藏 0

 

一,什么是反射(反射的概念)?

反射是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

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

二,如何使用反射

要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产 生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。 

Employee类

public class Employee
{
   private String name;
   public String age;
   
   public void print(){
   //...
   }
}

(1)反射获取类(三种方法)

//第一种方式:通过  Class.forName("类的全称")  
Classc1 = Class.forName("Employee");  

//第二种方式:通过  类名.class  
Classc2 = Employee.class;  
   
//第三种方式:类的对象.getClass()
Employee e = new Employee();  
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)  

(2)创建对象

Class c =Class.forName("Employee");  
  
Objecto = c.newInstance(); //调用了Employee的无参数构造方法,Objecto为创建的对象

(3),获取属性:所有的属性和指定的属性

Class c = Class.forName("java.lang.Integer");  
//获取所有的属性
Field[] fs = c.getDeclaredFields();
//获取类  
Class c = Class.forName("Employee");  
//获取id属性  
Field idF = c.getDeclaredField("name");   
//打破封装:若该字段是私有的,需要调用setAccessible(true)方法
idF.setAccessible(true);

 总结

public Field getDeclaredField(String name) // 获得该类自身声明的所有变量,不包括其父类的变量
public Field getField(String name) // 获得该类自所有的public成员变量,包括其父类变量

//具体实现
Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性 
Field[] publicFields = class1.getFields();//获取class对象的public属性 
Field ageField = class1.getDeclaredField("age");//获取class指定属性 
Field desField = class1.getField("des");//获取class指定的public属性

(4)获取构造函数

//Constructor是一个已有的类
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //  获得该类所有的构造器,不包括其父类的构造器
public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类所以public构造器,包括父类

//具体
Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//获取class对象的所有声明构造函数 
Constructor<?>[] publicConstructors = class1.getConstructors();//获取class对象public构造函数 
Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数 
Constructor publicConstructor = class1.getConstructor(String.class);//获取指定声明的public构造函数

(5)获取方法

Class cls = Class.forName("Employee"); 
Method setMethod = cls.getDeclaredMethod("name",String.class); 

注:更加详细的知识【https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/

© 著作权归作者所有

共有 人打赏支持
javaART
粉丝 1
博文 36
码字总数 12872
作品 0
昆明
后端工程师
私信 提问

暂无文章

tomcat编译超过64k大小的jsp文件报错原因

  今天遇到一个问题,首先是在tomcat中间件上跑的web项目,一个jsp文件,因为代码行数实在是太多了,更新了几个版本之后编译报错了,页面打开都是报500的错误,500的报错,知道http协议返回...

SEOwhywhy
13分钟前
0
0
flutter http 请求客户端

1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/http#-installing-tab-”确认版本号后,将http(0...

渣渣曦
14分钟前
0
0
Django基本命令及moduls举例

一、Django基本命令 1.创建项目 django-admin.py startproject mysite 创建后的项目结构:- mysite - mysite #对整个程序进行配置 - init #导入包专用- settings ...

枫叶云
28分钟前
4
0
zabbix安装

rpm -ivh http://repo.webtatic.com/yum/el6/latest.rpm 安装jdk rpm -ivh (自行在网上下载rpm包) 安装php并修改相应参数 yum -y install php56w php56w-gd php56w-mysqlnd php56w-bcmath......

muoushi
30分钟前
3
0
MySQL自增属性auto_increment_increment和auto_increment_offset

MySQL的系统变量或会话变量auto_increment_increment(自增步长)和auto_increment_offset(自增偏移量)控制着数据表的自增列ID。 mysql> show tables;Empty set (0.00 sec)mysql> CREATE TA......

野雪球
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部