文档章节

Java反射机制

javaART
 javaART
发布于 2017/09/03 21:01
字数 719
阅读 3
收藏 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
粉丝 0
博文 36
码字总数 12872
作品 0
昆明
后端工程师

暂无文章

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部