首页 > 其他分享 >反射Reflection

反射Reflection

时间:2022-10-27 21:13:58浏览次数:86  
标签:Field aClass Reflection 反射 Class 获取 User public

1.1 简介

反射是框架设计的灵魂

将类的各个组成部分封装为其他对象

Source源代码阶段->Class类对象阶段->Runtime运行时阶段

1.2 获取Class对象

  1. Class.forName("全类名路径"):将字节码文件加载进内存,返回Class对象。多用于配置文件。
  2. 类名.class:通过类名的属性class来获取。多用于参数的传递。
  3. 对象.getClass():在Object类中定义。多用于对象的获取字节码的方式。
package com.xxx;

public class Test01 {
    /*
    获取Class对象的三种方式:
    1. Class.forName("全类名路径"):将字节码文件加载进内存,返回Class对象
    2. 类名.class:通过类名的属性class来获取
    3. 对象.getClass():在Object类中定义
     */
    public static void main(String[] args) throws ClassNotFoundException {
        //1.Class.forName
        Class aClass = Class.forName("com.xxx.night.User");
        //2.类名.class
        Class aClass1 = User.class;
        //3.对象.getClass
        User user = new User();
        Class aClass2 = user.getClass();

        System.out.println(aClass == aClass1);//true
        System.out.println(aClass == aClass2);//true
    }
}

1.3 Class对象的获取功能

1.3.1 获取成员变量
  • Field[] getFields()
  • Field getField(String name)
  • Field[] getDeclaredFields()
  • Field getDeclaredField(String name)
package com.xxx;

import java.lang.reflect.Field;

public class Test02 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        //1、Field[] getFields()获取所有public修饰的成员变量
        Class userClass = User.class;
        Field[] fields = userClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //2、Field getField(String name)获取指定名字的public修饰的成员变量
        Field field = userClass.getField("name");

        User user = new User();//获取成员变量name的值
        field.get(user);
        
        field.set(user,"张三");//设置name的值
        System.out.println(user);

        //3、Field[] getDeclaredFields()获取所有成员变量,不考虑修饰符
        Field[] declaredFields = userClass.getDeclaredFields();
        for (Field df : declaredFields) {
            System.out.println(df);
        }

        //4、Field getDeclaredField(String name)
        Field declaredField = userClass.getDeclaredField("age");
        declaredField.setAccessible(true);//暴力反射
        Object o = declaredField.get(user);
        System.out.println(o);

    }
}

1.3.2 获取构造方法
  • Constructor<?>[] getConstructors()
  • Constructor getConstructor(类<?>... parameterTypes )
  • Constructor getDeclaredConstructor(类<?>... parameterTypes )
  • Constructor<?>[] getDeclaredConstructors()
	/*
    1、getConstructors()获取所有public修饰的构造方法
     */
    @Test
    public void show1() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> c : constructors) {
            System.out.println(c);
        }
    }

	/*
    2、getDeclaredConstructors()获取所有的构造方法,包括私有
    */
    @Test
    public void show2() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");

        Constructor<?>[] dcs = aClass.getDeclaredConstructors();
        for (Constructor<?> dc : dcs) {
            System.out.println(dc);
        }
    }

	/*
    3、getConstructor()获取单个public修饰的构造方法
     */
    @Test
    public void show3() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class aClass = Class.forName("com.xxx.forenoon.User");

        Constructor con = aClass.getConstructor();

        User in = (User) con.newInstance();
        in.getName();

    }

	/*
    4、getDeclaredConstructor()获取单个私有构造方法
     */
    @Test
    public void show4() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取class对象
        Class aClass = Class.forName("com.xxx.forenoon.User");

        //获取单个私有构造方法
        Constructor constructor = aClass.getDeclaredConstructor(String.class, int.class);

        //使用暴力反射取出私有
        constructor.setAccessible(true);

        User user = (User) constructor.newInstance("小明", 18);
        System.out.println(user.name);

    }

1.3.3 获取成员方法
  • Method[] getMethods()
  • Method getMethod(String name,类<?>... parameterTypes)
  • Method[] getDeclaredMethods()
  • Method getDeclaredMethod(String name,类<?>... parameterTypes )
	/*
    1、Method[] getMethods()获取所有public修饰的成员方法
     */
    @Test
    public void showInfo() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");
        //获取所有公有成员方法
        Method[] methods = aClass.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
    }

    /*
    2、getDeclaredMethods()获取所有成员方法,包括私有
     */
    @Test
    public void showInfo2() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");
        Method[] methods = aClass.getDeclaredMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
    }

    /*
    3、getConstructor()获取单个public修饰的成员方法
     */
    @Test
    public void showInfo3() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");
        //先获取构造方法
        Constructor<?> constructor = aClass.getConstructor();
        //再实例化对象
        Object o = constructor.newInstance();

        //获取单个公有的成员方法
        //getMethod的参数是(方法名)
        Method showInfo = aClass.getMethod("showInfo");
        //invoke的参数是(实例化对象)
        showInfo.invoke(o);
    }

    /*
    4、getConstructor()获取单个私有成员方法
     */
    @Test
    public void showInfo4() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");
        //先获取构造方法
        Constructor<?> constructor = aClass.getConstructor();
        //再实例化对象
        Object o = constructor.newInstance();

        //获取单个私有成员方法
        //getDeclaredMethod的参数是(方法名,方法参数类型.class)
        Method show = aClass.getDeclaredMethod("show", String.class);
        //invoke的参数是(实例化对象,方法参数的实参)
        show.invoke(o,"包子");
    }
1.3.4 获取类名
  • String getName()
    @Test
    public void showInfo() throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.xxx.forenoon.User");

        //获取类名
        String className = aClass.getName();
        System.out.println(className);

        //获取方法名
//        method.getName();
    }

标签:Field,aClass,Reflection,反射,Class,获取,User,public
From: https://www.cnblogs.com/wyzel/p/16833730.html

相关文章

  • 笔记(反射)
      第一个:  这个是将字符串转成json;第二个:  这个吧,emmm,就是将类转成class对象(这样子说应该正确吧?)第三个:  这个就是利用类来创建对象啦,就和利用无参构......
  • Java反射之类的字节码对象的三种调用方式和JDBC【多测师】
    类的字节码对象:packagecom.section02;importorg.apache.log4j.Logger;importcom.section01.Student;/***@authorxiaoshu*同一个类在JVM中只存在一份字节码对象*也就是......
  • CTFHUB-Web技能树-XSS-反射型
    原文链接:https://blog.csdn.net/weixin_45808483/article/details/121330374一、题目二、工具使用XSSplatform平台进行攻击首先先注册,然后新建一个项目   我......
  • 上篇:Go的反射基础
    什么是反射反射的机制是在运行时可以获取到其变量的类型和值,且可以在运行时对其变量类型和值进行检查,可以对其值进行修改。这种机制,其实在编写业务代码时是比较少用到的,......
  • java反射机制的作用
    反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。反射是一项高级开发人员应该......
  • 【Java八股】Java反射的优缺点
    Java反射的优点:增加程序的灵活性,可以在程序运行过程中动态的对类进行修改和操作。提高代码的复用率,比如动态代理,就是利用了反射来实现。可以在运行时轻松获取任意一个......
  • 使用Expression代替反射读取IDataReader或IDataRecord给实体类赋值
    ExpressionMapper代码usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Data.Common;usingSy......
  • Java反射获取方法参数名
      正常环境下,获取不到参数的名称,使用java反射时,第一个参数名是arg0,第二个参数是arg1,与我们代码中写的对不上。java反射过程中,需要我们做好判断:if(!parameter.isName......
  • day16 正则表达式 & 反射 & Java内存模型(JMM)
    day16class1)获取一个类的所有信息(变量、方法、构造方法)2)创建类对象newInstance()Field1)访问变量或给变量赋值Method1)执行具体类对象的指定方法3.Method(获取方法对......
  • TH系列新品16口ACC-5595反射内存交换机
    一、光纤网简介 在半实物仿真系统等实时系统中,要求系统各部分之间的数据传输具有很高的实时性,而传统的网络技术,如以太网、FDDI等在实时应用中存在以下缺点:(1)数据传输速率不......