文档章节

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
博文 35
码字总数 12391
作品 0
昆明
后端工程师

暂无文章

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部