首页 > 其他分享 >反射

反射

时间:2024-07-05 20:31:10浏览次数:7  
标签:反射 aClass System Method println class out

1.什么是反射?

  • 反射它是框架设计的灵魂。

  • 反射就是类在运行期间,把类中成员抽取为其他类的过程就是反射。

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

  • 例子: spring框架中只需要传入类的路径----spring框架就会帮你创建类的对象。


2.获取Class反射类的方式

  • 第一种: 通过类名.class属性
Class<Student> aClass = Student.class;
  • 第二种: 通过类路径获取
Class aClass1 = Class.forName("com.ykq.test.Student");
  • 第三种: 通过对象名获取反射类型
Student student = new Student();
   Class aClass2 = student.getClass();

3. Class类中常用的方法

public static void main(String[] args) throws Exception {
      Class<Student> aClass = Student.class;
      //通过反射类创建类对象--思考: mybatis SqlSession.getMapper(StudentDao.class)
                         //bean  class= "com.ykq.Student"
      Student student = aClass.newInstance();
      System.out.println(student);
      //获取反射类上的注解对象---反射是在运行时得到
      MyAnnotation annotation = aClass.getAnnotation(MyAnnotation.class);
      System.out.println(annotation.value());
      
  }
  • 根据反射类得到实例对象 newInstance()

  • 得到反射类上的注解对象 getAnnotation()

4. 获取Method方法类对象

public static void main(String[] args) throws Throwable{
        Class<Student> aClass = Student.class;
        //得到本类中定义的所有Method类对象
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method m :declaredMethods){
            System.out.println(m);
        }

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        //获取本类中指定的方法对象
        Method fun = aClass.getDeclaredMethod("fun",Integer.class);
        System.out.println(fun);

        //获取本类以及父类中所以public方法对象
        Method[] methods = aClass.getMethods();
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        for (Method m :methods){
            System.out.println(m);
        }

        //获取本类以及父类中指定的public方法对象
        Method method = aClass.getMethod("equals", Object.class);
        System.out.println(method);
    }
  • getDeclaredMethods(): 得到本类中所有的方法。

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

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

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

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

package com.ykq.test;

import java.lang.reflect.Method;

public class Test04 {
    public static void main(String[] args) throws Exception {
        //泛型通配符
        Class<?> aClass = Class.forName("com.ykq.test.People");
        Object o = aClass.newInstance();
        Method method = aClass.getMethod("print");

        //执行该方法 返回该方法执行的结果.
        //第一个参数表示执行方法的对象
        Object result = method.invoke(o);

        System.out.println(result);

        System.out.println("~~~~~~~~~~~~~~~~~~~~~");
        Method method1 = aClass.getMethod("hehe", int.class);
        Object result1 = method1.invoke(o, 25);
        System.out.println(result1);

        Method print02 = aClass.getDeclaredMethod("print02");
        //IllegalAccessException: private私有方法不能被反射调用-->强力反射
        print02.setAccessible(true);//设置允许访问私有成员
        Object ressult2 = print02.invoke(o);
        System.out.println(ressult2);

    }
}
  • Object r=invoke(Object对象,参数值)

  • setAccessible()设置允许访问私有成员

6. 获取Field属性对象的方式

public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
      Class<Student> aClass = Student.class;
      Student student = aClass.newInstance();

      Field name = aClass.getDeclaredField("name");
      System.out.println(name);
  }

7. Field类中常用的方法

Class<Student> aClass = Student.class;
        Student student = aClass.newInstance(); //new Student()
//        System.out.println(student);
//        Field name = aClass.getDeclaredField("name");
//        name.set(student,"刘德华"); //student.setName("刘德华");
//        System.out.println(student);
//
//        Field age = aClass.getDeclaredField("age");
//        age.setAccessible(true);
//        age.set(student,18);
//        System.out.println(student);

        //获取属性名
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName());
            //获取每个属性对象上的注解对象
            MyAnnotation annotation = declaredField.getAnnotation(MyAnnotation.class);
            String value = annotation.value();
            System.out.println(value);
        }
  • set(Object对象,值):为属性赋值

  • getName():获取属性名

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

标签:反射,aClass,System,Method,println,class,out
From: https://www.cnblogs.com/zyqq/p/18286532

相关文章

  • Java28-反射
    目录概述学习反射到底学什么获取字节码文件对象的三种方式字节码文件和字节码文件对象获取构造方法获取构造方法并创建对象获取成员变量获取成员变量并获取值和修改值获取成员方法获取成员方法并运行练习泛型擦除修改字符串的内容反射和配置文件结合动态获取利......
  • 【Java基础】——反射
    1.什么是反射反射是指在程序运行时能够访问、检查和修改自身状态或行为的能力。通过反射,程序可以动态地获取类的信息、调用类的方法,并修改类的属性。再简单点来说,反射就是类在运行期间,把类中成员抽取为其他类的过程就是反射。2.为什么使用反射(面试常问)关于这个问题,如果按照......
  • C#利用反射创建对象并进行赋值
    TypeclassType=typeof(ClassName);//获取类的typestringpath=fullName+","+assemblyName;//命名空间.类型名,程序集TypeclassType=Type.GetType(path);//加载类型TypeclassType=Type.GetType("类的完全限定名");//也可以根据类的完全限定名得到typ......
  • 实例--通过反射手写持久层框架
    简介涉及技术栈:javamysql反射自定义注解泛型jdbc持久层框架:与数据库交互的一层称为持久层(俗称dao层)作用:可以无需写sql语句即可完成对表单的CRUD操作引用相关jar包<dependency><groupId>junit</groupId><artifactId>junit</artifactId><ve......
  • 通过反射对比两个对象是否相等
    /***通过反射对比两个对象是否相等**@paramobj1obj1*@paramobj2obj2*@returnboolean*@throwsIllegalAccessExceptione*/publicstaticbooleanpropertiesAreEqual(Objectobj1,Objectobj2)throwsIllegalAccessException{if(obj1==obj2){......
  • 反射
    反射1.什么是反射Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。2.为......
  • Java中的反射
    1.什么是反射?反射是框架设计的灵魂。反射(Reflection)是Java的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象,调用方法以及设置属性。简单来说就是在类运行......
  • 反射的概念和使用
    反射的概念 反射是框架设计的灵魂,就是在类运行期间把类中成员抽取为其他类的过程为什么使用反射反射就是为了解决在运行期间对某个实例一无所知的情况下调用其方法和属性获取class反射类的三种方式一、通过类名.class属性Class<泛型>命名=类名.class;二、通......
  • 学懂C#编程:常用高级技术——学会C#的高级特性 反射
    反射(Reflection)是C#中的一项高级特性,它允许程序在运行时检查和操作程序集、模块、类型等元数据信息。通过反射,你可以在不知道类型信息的情况下,动态地创建对象、调用方法、访问属性等。反射的基本概念反射的核心在于System.Reflection命名空间,它提供了许多类和接口,用于获取类......
  • JAVA高级进阶13单元测试、反射、注解
    第十三天、单元测试、反射、注解单元测试介绍单元测试就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试咱们之前是如何进行单元测试的?有啥问题?只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能影响其他方......