专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Java反射

Java反射

反射:框架设计的灵魂
框架:半成品,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他的对象,这就是反射机制
好处:
1、可以在程序的运行过程中,操作这些对象
2、可以解耦,提高程序的可拓展性

下面我们用一张图来讲述java的反射机制

130_1.png130_2.png由图可见将类的各个组成部分封装为一个个对象,成员变量封装为field对象,构造方法封装为con对象,成员方法封装围为method对象

获取Clss对象的三种方式

1、 Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2、 类名.class:通过类名的属性class获取
* 多用于参数的传递
3、 对象.getClass():getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式

代码

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> person = Class.forName("Reflect.Person");
        System.out.println(person);
        Class<Person> personClass = Person.class;
        System.out.println(personClass);
        Person person1 = new Person();
        Class<? extends Person> aClass = person1.getClass();
        System.out.println(aClass);
    }
}

结果

130_3.png

可见一个类,在一次运行过程中只会被加载一次

那么class对象有什么用呢?

获取功能:
1、 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量

            * Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
            * Field getDeclaredField(String name)  

package Reflect;
import java.lang.reflect.Field;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //使用getFields方法获取public修饰的方法
        Field[] fields = personClass.getFields();
        System.out.println("getFields方法:");
        //获取public修饰的成员变量
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("getDeclaredFields方法:");
        //使用getDeclareFields方法获取全部成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
    }
}

结果:
130_4.png

        2. 获取构造方法们
            * Constructor<?>[] getConstructors()  
            * Constructor<T> getConstructor(类<?>... parameterTypes)  

            * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  
            * Constructor<?>[] getDeclaredConstructors()  

package Reflect;
import java.lang.reflect.Constructor;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取public 修饰的构造方法
        Constructor<?>[] constructors = personClass.getConstructors();
        System.out.println("Public修饰的构造方法:");
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        //获取所有构造方法
        System.out.println("所有构造方法:");
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
    }
}

结果:
130_5.png

        3. 获取成员方法们:
            * Method[] getMethods()  
            * Method getMethod(String name, 类<?>... parameterTypes)  

            * Method[] getDeclaredMethods()  
            * Method getDeclaredMethod(String name, 类<?>... parameterTypes)  

        4. 获取全类名    
            * String getName()  
            * 

package Reflect;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取全类名
        String name = personClass.getName();
        System.out.println(name);
    }
}

结果

130_6.png

Field:成员变量
* 操作:
1、 设置值
* void set(Object obj, Object value)
2、 获取值
* get(Object obj)

        3. 忽略访问权限修饰符的安全检查
            * setAccessible(true):暴力反射

Constructor:构造方法
创建对象:
* T newInstance(Object… initargs)

        * 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
       //获取class对象
        Class<Person> personClass = Person.class;
        Person person = new Person();
        Constructor<Person> one = personClass.getConstructor(String.class, int.class);
        System.out.println(one);
        //构造方法1
        System.out.println("构造方法1:");
        Person zhangsan = one.newInstance("zhangsan", 11);
        System.out.println(zhangsan);
        System.out.println("构造方法2:");
        Person person2 = personClass.newInstance();
        System.out.println(person2);
    }
}

结果
130_7.png

Method:方法对象
执行方法:
Object invoke(Object obj, Object… args)

     获取方法名称:
         String getName:获取方法名

以上就是java反射的一些基础知识,如有错误还请各位批评指正,喜欢我的可以点赞收藏,也可以关注呀

130_8.png

文章永久链接:https://tech.souyunku.com/38823

未经允许不得转载:搜云库技术团队 » Java反射

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们