首页 > 其他分享 >反射

反射

时间:2024-07-01 20:44:02浏览次数:15  
标签:反射 获取 实例 c1 Method 属性

反射

1.什么是反射

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。

2.为什么使用反射

反射是为了解决在运行期,对某个实例一无所知的情况下,调用其方法或属性。

3.如何获取一个类的反射类实例

// 方式1: 使用全类名
Class c1 = Class.forName("全类名");
// 方式2: 类名.class 以 Student 的类为例
Class c2 = Student.class;
// 方式3: 使用类对象获取
Class c3 = student.getClass();

4.Class类中常用的方法

package com.lyl.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface MyAnnotation {
    String value();
}

package com.lyl.entity;
import com.lyl.annotation.MyAnnotation;

@MyAnnotation("lyl")
public class Student {
    private String name;
    private Integer age;
}

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        // 1.根据反射类获取类的实例 newInstance()
        Class c1 = Student.class;
        Student student = (Student) c1.newInstance();
        System.out.println(student);
        // 2.根据反射类获取类上的注解 getAnnotation(注解名.class)
        MyAnnotation annotation = c1.getAnnotation(MyAnnotation.class);
        System.out.println(annotation.value());
    }
}

5.获取Method方法类对象

getDeclaredMethods(): 得到本类中所有的方法。

getDeclaredMethod("方法名",参数类型):获取本类中指定的方法对象

getMethods():获取本类以及父辈类中public修饰的方法。

getMethod("方法名",参数类型):获取本类以及父辈类中指定public修饰的方法。

// 1.得到本类中定义的所有Method类对象 getDeclaredMethods()
Class c1 = Student.class;
// 得到本类中定义的所有Method类对象
Method[] declaredMethods = aClass.getDeclaredMethods();
// 遍历所有的Method类对象
for(Method m :declaredMethods){
    System.out.println(m);
}
// 2.获取本类中指定的Method类对象 getDeclaredMethod(方法名,...[参数类型的反射类实例])
Method m1 = c1.getDeclaredMethod("fun",Integer.class);
// 3.获取本类以及父类中所以public修饰的Method类对象
Method[] methods = c1.getMethods();
// 遍历所有的Method类对象
for(Method m :methods){
    System.out.println(m);
}
// 4.获取本类以及父类中指定的public修饰的Method类对象
Method m2 = c1.getMethod("equals", Object.class);
System.out.println(m2);

6.Method类对象中常用的方法

// invoke("反射类的实例对象",...[参数类型的反射类实例])
// 例子
// 1.首先获取类的反射实例
Class c1 = Class.forName("全类名");
// 2.使用反射创建类的实例
Object o = c1.newInstance();
// 3.获取指定的 Method 类实例
Method m = c1.getMethod(方法名,...[参数类型的反射类实例]);
// 4.执行方法,返回方法执行的结果
Object result = m.invoke(o,...方法参数);

7.获取Field属性类对象

getDeclaredFields() 获取本类中所有的属性类对象

getDeclaredField(String name) 获取本类中所有的属性类对象

getFields() 获取所有本类和父类中 public 修饰的属性的属性类对象

getField(String name) 获取指定本类和父类中 public 修饰的属性的属性类对象

// 实例
// 1.首先获取类的反射类实例
Class c1 = 类名.class;
// 2.通过反射类创建类的实例
类名 实例名 = (类名) c1.newInstance();
// 3.获取指定属性的属性类实例
Field 属性名 = c1.getDeclaredField("属性名");

8.Field类中常用的方法

set(Object对象,值):为属性赋值

getName():获取属性名

getAnnotation():获取属性上的注解对象

// 1.为属性赋值 set(Object,值)
// 2.获取属性名 getName() 
// 3.获取属性上的注解对象 getAnnotation()
// 实例
// 1.获取反射类的实例
Class c1 = 类名.class;
// 2.获取所有属性的属性类实例
Field[] fields = c1.getDeclaredFields();
// 3.遍历所有的属性类实例
for(Field field : fields){
    // 输出所有的属性名
   System.out.println(declaredField.getName());
    // 获取每个属性对象上的注解对象
    注解名 注解实例名 = field.getAnnotation(注解名.class);
    类型名 变量名 = 注解实例名.value();
    // 输出注解中的值
    System.out.println(变量名);
}
// 4.为属性赋值
// 使用反射类生成类的实例
Object o = c1.newInstance();
// 获取指定属性的属性类实例
Field field = c1.getDeclaredField("属性名")
// 为实例中的属性赋值
field.set(o,属性值);

9.暴力反射

对于属性和方法中的私有字段,当使用反射获取后无法直接访问,需要在使用之前开启访问允许 ,使用方式如下:

属性类实例.setAccessible(true);

方法类实例.setAccessible(true);

属性类实例.setAccessible(true);
方法类实例.setAccessible(true);

10.反射综合案例

在properties属性文件中指定类的路径,通过反射完成类对象的创建以及类中属性的赋值

 public class Test{
        public static void main(String[] args) throws Exception {
        //1.加载属性文件
        InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("xxx.properties");
        //2.通过属性类Properties
        Properties properties=new Properties();
        properties.load(resourceAsStream);
        //3.属性类读取属性文件中指定的key的值
        String className = properties.getProperty("className");
        //4. 根据类路径得到反射对象
        Class<?> aClass = Class.forName(className);
        //5. 根据反射类创建类对象
        Object o = aClass.newInstance();
        System.out.println(o);
        //6.为属性赋值
        Field[] declaredFields = aClass.getDeclaredFields();
        for(Field field:declaredFields){
            field.setAccessible(true);
            field.set(o,new Random().nextInt(1000)+"");
        }
        System.out.println(o);
    }
 }


xxx.properties

className=com.lyl.entity.people

com.lyl.entity.people

public class People{
    private String name;
    private String sex;
}

11.备注

标签:反射,获取,实例,c1,Method,属性
From: https://www.cnblogs.com/lsran/p/18278805

相关文章

  • Java中的反射
    1.什么是反射?反射是框架设计的灵魂。反射(Reflection)是Java的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象,调用方法以及设置属性。简单来说就是在类运行......
  • 反射的概念和使用
    反射的概念 反射是框架设计的灵魂,就是在类运行期间把类中成员抽取为其他类的过程为什么使用反射反射就是为了解决在运行期间对某个实例一无所知的情况下调用其方法和属性获取class反射类的三种方式一、通过类名.class属性Class<泛型>命名=类名.class;二、通......
  • 学懂C#编程:常用高级技术——学会C#的高级特性 反射
    反射(Reflection)是C#中的一项高级特性,它允许程序在运行时检查和操作程序集、模块、类型等元数据信息。通过反射,你可以在不知道类型信息的情况下,动态地创建对象、调用方法、访问属性等。反射的基本概念反射的核心在于System.Reflection命名空间,它提供了许多类和接口,用于获取类......
  • JAVA高级进阶13单元测试、反射、注解
    第十三天、单元测试、反射、注解单元测试介绍单元测试就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试咱们之前是如何进行单元测试的?有啥问题?只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能影响其他方......
  • 用pyart绘制雷达图像并进行反射率修正
    目录前言反射率衰减修正前言这是一篇关于使用Python库Py-ART读取雷达数据文件、绘制雷达图并进行反射率修正的教程。这篇文章是我在2020年8月做大创项目的时候写的,由于中间修改过代码,并不确定代码100%正确。原地址:Py-ART简易中文教程随着gitee关闭了pages......
  • 《分析模式》漫谈04- 反射·电动车周某
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集《分析模式》第2章里面有这么一段话:里面提到两个词,一个是reflection,一个是mapping。2004中译本的翻译是这样的:这个翻译把reflection和后面的similar合并在一起称为“相互对应”,......
  • Kotlin反射(模块化讲解)
    参考文档:Kotlin反射全解析1–基础概念-简书反射·Kotlin官方文档中文版反射·Kotlin语言官方参考文档中文版反射·kotlin-docs-zh反射·Kotlin语言官方参考文档中文版反射·Kotlin官方文档中文版Kotlin反射:深入探索与多场景应用-CSDN博客Kot......
  • Java学习基础笔记——反射机制
    第十五章反射15.1反射机制15.1.1 Java反射机制可以完成15.1.2 反射的优缺点15.2Class类15.2.1基本介绍15.2.2Class类常用方法15.2.3获取Class类对象6种方式15.3类加载15.3.1基本说明15.3.2类加载时机15.4反射获取类的结构信息15.5反射调用性能......
  • 反射
    作用:1.获取任意一个类中的所有信息2.结合配置文件动态创建对象使用:1.获取class字节码文件对象。Class.former("全类名")|类名.class|对象.getclass()2.获取所有的成员变量。get:获取set:设置Constructor:构造方法Parameter:参数Field:成员变量Modifiers:......
  • Web渗透:XSS-反射型&存储型
    跨站脚本攻击(Cross-SiteScripting,XSS)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到网页中,其他用户在浏览这些页面时,可能会执行这些恶意脚本,从而导致各种安全问题,如窃取用户信息、会话劫持等。产生原因:XSS漏洞其实就是一个前端漏洞,产生的根本原因是未对用户输入进行......