首页 > 其他分享 >对反射的一些理解笔记

对反射的一些理解笔记

时间:2023-08-11 11:14:30浏览次数:31  
标签:反射 String 对象 Class 笔记 class 获取 理解 public

反射的知识点

1:什么是反射

反射是框架完成的核心。那什么又是框架呢?框架是一个半完成品的程序,在开发项目的时候可以直接拿来用。用于提高效率

反射就是把java类中的各个成分映射成一个个的java对象。

 

2:获取反射的Class

注意:java中,无论生成每个类的多少个对象,这些对象都会对应于同一个Class对象。(一个类的字节码指挥被加载一次)

从上述分析可知,任意一个字码节都会通过ClassLoader类加载器,加载到JVM内存中,以Class对象的形式存在。

常见的获取Class对象的方式有三种:

第一种 Class.forName("类路径")
第二种 类名.class
第三种 对象.getClass();

 

 

 

public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// 第一种:根据user类路径获取user的反射对象
Class<?> aClass = Class.forName("demo4.User");
System.out.println(aClass);
// 第二种:根据类名获取user类的反射对象
Class<User> userClass =User.class;
System.out.println(userClass);
// 通过类对象获取类的反射对象
User user = new User();
Class<? extends User> aClass1 = user.getClass();
System.out.println(aClass1);
//判断是否为同一个Class对象
System.out.println(aClass==userClass);
System.out.println(userClass==aClass1);
}
}
class User{
private String users;
private Integer pwd;
public String getUsers(){
return users;
}
public void setUsers(String users){
this.users=users;
}

public Integer getPwd() {
return pwd;
}

public void setPwd(Integer pwd) {
this.pwd = pwd;
}
}

结果展示:

3:通过反射获取反射类对象

通过Class类对象,调用newiInstance()

public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<User> aClass2 =(Class<User>)Class.forName("demo4.User");
// 通过反射类的到对应的类对象---之前的方式:new USer 来获取User类的对象
User user1 = aClass2.newInstance();
User user2 = aClass2.newInstance();
System.out.println(user2==user1);
System.out.println(user1);

}
}
class User{
private String users;
private Integer pwd;
public String getUsers(){
return users;
}
public void setUsers(String users){
this.users=users;
}

public Integer getPwd() {
return pwd;
}

public void setPwd(Integer pwd) {
this.pwd = pwd;
}
}

spring根据你传递的类路径--得到该类的反射类---并通过newInstance()创建类对象

4:获取反射类中的属性成员对象

字节码中的属性成员被加载到内存中后会以Field类对象的形式存在。如何获取Field属性对象,可通过以下几种方式:

1.获取本类中指定的属性对象
反射类.getDeclaredField("属性名")
2.获取本类以及父类中指定的public修饰的属性
反射类.getField("属性名")
3.获取本类中所有的属性对象
反射类.getDeclaredFields("属性名")
4.获取本类以及父类中所有public修饰的属性
反射类.getFields("属性名")

public class Test2 {
public static void main(String[] args) throws NoSuchFieldException {
// 获取docter反射类
Class<Docter> docterClass = Docter.class;
// 获取反射类中的成员对象
Field[] declaredFields = docterClass.getDeclaredFields();//获取本类中的所有属性对象
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("=================");
Field[] fields = docterClass.getFields();//获取本类以及父类中的public对象
for (Field field : fields) {
System.out.println(field);
}
Field x = docterClass.getField("y");
System.out.println(x);
}

}
class People{
private String x;
public String y;
}
class Docter extends People{
private String name;
public String pwd;
String sex;

@Override
public String toString() {
return "Docter{" +
"name='" + name + '\'' +
'}';
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("姓名:"+name);
}
}

5:Field类中常用的方法

1.获取属性名

属性对象.getName():
2.设置属性可访问(会打破封装)

属性对象.setAccessible(true);
3.为对象的属性赋值

属性对象.set(对象,值)

属性对象为你获取到的属性对象,对象为你要赋值属性所属的对象。
4.获取对象的属性值

属性对象.get(对象)

这里属性对象为你获取到的属性对象,对象为你要获取属性值所属的对象。

 public class Test3 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
// 获取反射类对象
Class<Teather> teatherClass = Teather.class;
// 通过了反射对象获取类对象
Teather teather = teatherClass.newInstance();
System.out.println(teather);
// 得到类对象中的属性
Field declaredField = teatherClass.getDeclaredField("age");
declaredField.set(teather,18);//通过set属性对象为Teather对象赋值
System.out.println(teather);
Field name = teatherClass.getDeclaredField("name");

// 允许访问私有属性
name.setAccessible(true);
name.set(teather,"张飞");
System.out.println(teather);
}
}

6. 获取方法类对象

1.获取本类中所有的方法:

反射类.getDeclaredMethods();

得到的是一个存放所有方法的数组
2.获取本类和父类中所有public修饰的方法

反射类..getMethods();

得到的是一个存放所有方法的数组
3.获取本类中指定的方法对象

反射类.getDeclaredMethod("方法名",方法参数);
4.获取本类及父类中指定名称的方法对象

反射类.getMethod("方法名", 方法参数);

public class Test4 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException {
// 获取反射类对象
Class<Hello> helloClass = Hello.class;
// 获取hello对象
Hello hello = helloClass.newInstance();
// 获取本类中所有的Method方法对象
Method[] declaredMethods = helloClass.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println(method);
}
Method sun= helloClass.getMethod("sun",int.class);
System.out.println(sun);
}
// 得到本类以及父类中的public修饰的方法对象
}

7:Method类中常用方法

invoke(对象,方法参数值):执行方法体

获取的注解对象.value()

public class Test5 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// 获取反射类对象
Class<Word> wordClass = Word.class;
// 获取hello对象
Word word = wordClass.newInstance();
Method sun= wordClass.getMethod("sun",int.class,String.class);
//invoke回调执行该方法 执行方法 word指的调用的方法对象
Object result = sun.invoke( word,15,"123");
System.out.println(result);
MyWord annotation = sun.getAnnotation(MyWord.class);
System.out.println(annotation.value());
}
}

8:获取构造对象

只能得到本类中public的构造函数

getConstructor

得到本类中所有的public的构造函数

getConstructors

public class Test06 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException {
Class<?> aClass = T.class;
// 它只能得到本类中public的构造函数
Constructor<?>[] constructor = aClass.getConstructors();
for (Constructor<?> declaredConstructor : constructor) {
System.out.println(declaredConstructor);
}
}
}

8.2:Constructor类中常用的方法

获取类中所有声明的构造器的方法

getDeclaredConstructors

获取类中声明的构造器的方法

getDeclaredConstructor

    public static void main(String[] args) throws Exception {
Class<?> aClass = S.class;
//得到无参构造函数
// Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
// Object o = declaredConstructor.newInstance();
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);
Object world = declaredConstructor.newInstance("hello world");
}
}

 

标签:反射,String,对象,Class,笔记,class,获取,理解,public
From: https://www.cnblogs.com/zyjxm/p/17621469.html

相关文章

  • C语言个人笔记(持续更新中)
    第一&二章概况1在UNIX、LINUX和Windows下的运行过程c语言执行过程:源代码.c--->(编译器/汇编器)--->目标代码.obj--->(链接器)--->可执行代码.exe编译器:将c文件编译为汇编语言汇编器:将c文件编译为机器语言链接器:有三种链接方式:在UNIX系统上编译不具备专门的C语言编译器,通常......
  • 深入理解Spring Cloud中的服务熔断与降级策略
    在微服务架构中,服务之间的依赖关系复杂,某个服务的故障可能会影响到整个系统的稳定性。为了应对这种情况,服务熔断和降级策略成为了重要的技术手段。SpringCloud提供了Hystrix作为服务熔断和降级的解决方案。本文将深入讨论在SpringCloud中如何理解和使用服务熔断与降级策略,并提供......
  • 深入理解Spring Cloud中的服务熔断与降级策略
    在现代分布式系统中,服务之间的相互依赖性很高,一个服务的故障可能会对整个系统造成影响。为了提高系统的稳定性和可用性,引入服务熔断与降级策略变得至关重要。SpringCloud通过集成Hystrix来实现服务熔断和降级,本文将深入探讨这些概念,并提供详细的代码示例。什么是服务熔断与降级?服......
  • 数据库个人笔记(持续更新中)
    第一章绪论1.1数据库系统概述数据(Date)数据库(DB):长期储存在计算机中,有组织、可共享的大量数据集合。具有低冗余度、高数据独立性、易扩展的特点数据库管理系统(DBMS):是计算机基础软件,有以下几个功能:数据定义功能,提供数据定义语言(DDL)数据组织、存储和管理数据操作功能,提供数......
  • Javascript学习笔记-js实现拷贝复制功能
    /***复制单行内容到粘贴板*content:需要复制的内容*message:复制完后的提示,不传则默认提示"复制成功"*/functioncopyToClip(content,message){varaux=document.createElement("input");aux.setAttribute("value"......
  • 五分钟看完,彻底理解协变逆变
    其实这是c#的老知识点了,但是今天发现同事对这个竟然还一知半解,就和他们讲解了下,顺便也回顾了下,同事我也把我对这个的全部理解,融化成几分钟的讲解,保证大家5分钟内全部理解,看不懂来打我。目录协变、逆变解决的问题泛型类型转换原则核心核心依据Out/In输入输出?In示意图Out示意图......
  • 反射
    1、什么是反射   反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制2、获取Class的三种方式  第一种:Class.forName("类路径")//......
  • 《CUDA编程:基础与实践》读书笔记(4):CUDA流
    1.CUDA流一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列。除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者。一个CUDA流中的各个操作按照主机发布的次序执行;但来自两个不同CUDA流的操作不一定按照某个次序执行,有可能是并发或者交错地执行。任何CUDA操作......
  • java反射
    1.回顾泛型:[泛型类,泛型接口,泛型方法]publicclass类名<泛型标志...>{​//使用泛型标志定义数据类型}publicinterface接口<泛型标志>{​//使用泛型标志定义抽象方法}publicclass类名implements接口<泛型类型>{}publicclass类名<泛型标志>imp......
  • dus on tree学习笔记
    前言dusontree就像其实就像是暴力,但是通过选择正确的顺序,使得暴力变得更加的快速。算法思路查看题目给出一颗n个节点的树,每个节点有一个颜色,询问你没个节点的子树中有多少中颜色。显然,我们知道暴力扫的话是枚举每个点,再暴力去找他的子树,显然在暴力的情况下是\(O(n......