Java反射机制
博客专区 > javaART 的博客 > 博客详情
Java反射机制
javaART 发表于3个月前
Java反射机制
  • 发表于 3个月前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 

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

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

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/

标签: Java
共有 人打赏支持
粉丝 0
博文 33
码字总数 12342
×
javaART
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: