java反射详解

java反射详解

一、Java反射的基本概念

反射(Reflection)是Java编程语言的一个重要特性,由Smith在1982年首次提出。它允许程序在运行时进行自省(introspect)和操作类的内部结构和属性。简单来说,反射机制指的是程序在运行时能够获取自身的信息,包括类的所有属性和方法,并能动态地调用这些方法或构造器。Java反射机制主要依赖于java.lang.reflect包中的类和接口,这些类和接口提供了丰富的API来操作类、接口、字段、方法和构造器等。

二、Java反射的使用方法

创建一个person类

复制代码
package com.Month08.Day_04;

public class Person {
    private String name ;
    private int age ;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    
}

1.方式1:调用Object中的getClass方法:

复制代码
public class DemoClass01 {
    public static void main(String[] args) {
        Person person = new Person();
        Class<? extends Person> aClass = person.getClass();
    }
}

2.方式2:不管是基本类型还是引用类型,jvm都为其提供了一个静态成员:class

复制代码
public class DemoClass01 {
    public static void main(String[] args) {
        Class<Person> personClass = Person.class;
    }
}

3.方式3:Class类中的静态方法:

static Class<?> forName(String className)

className:传递的是类的全限定名(包名.类名)

复制代码
public class DemoClass01 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com/Month08/Day_04/Person.java");
    }
}

三. properties文件结合使用

参数为String形式,可以和properties文件结合使用 , 可以使得构造更灵活

创建properties文件

复制代码
path=com/Month08/Day_04/Person.java

实现类

复制代码
package com.Month08.Day_02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class PropertiesClass {
    public static void main(String[] args) throws IOException {
        // 创建properties对象
        Properties properties = new Properties();
        // 创建FileInputStream流对象
        FileInputStream fileInputStream = new FileInputStream("F:\\JavaProject\\Project\\src\\com\\Month08\\Day_02\\pro.properties");
        // 将Io流对象传入properties中
        properties.load(fileInputStream);
        // 获取到键对应的值
        String username = properties.getProperty("path");
        System.out.println(username);
    }
}

四. 获取Class对象中的构造方法

1.获取所有public的构造方法

1.Class类中的方法:

getConstructors() -> 获取所有public的构造

java 复制代码
public class Demo03GetConstructor {
    public static void main(String[] args) {
        //获取Class对象
        Class<Person> aClass = Person.class;
        //获取所有public的构造
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
    }
}

2.获取空参构造_public

1.Class类中的方法:

getConstructor(Class<?>... parameterTypes)->获取指定的public的构造

parameterTypes:可变参数,可以传递0个或者多个参数

a.如果获取的是空参构造:参数不用写

b.如果获取的是有参构造:参数写参数类型的class对象

2.Constructor类中的方法:

T newInstance(Object...initargs) -> 创建对象

initargs:传递的是构造方法的实参

a.如果根据无参构造new对象,initargs不写了

b.如果根据有参构造new对象,initargs传递实参

java 复制代码
public class Demo04GetConstructor {
    public static void main(String[] args)throws Exception {
        //获取Class对象
        Class<Person> aClass = Person.class;
        Constructor<Person> constructor = aClass.getConstructor();
        System.out.println("constructor = " + constructor);

        /*
          好比是Person person = new Person()
         */
        Person person = constructor.newInstance();

        //好比是直接输出对象名,默认调用toString
        System.out.println(person);
    }
}

3.利用空参构造创建对象的快捷方式_public

Class类中的方法:

newInstance() -> 根据空参构造创建对象

前提:被反射的类中必须有public的空参构造

java 复制代码
public class Demo05GetConstructor {
    public static void main(String[] args)throws Exception {
        //获取Class对象
        Class<Person> aClass = Person.class;
        /*
          好比是Person person = new Person()
         */
        Person person = aClass.newInstance();

        //好比是直接输出对象名,默认调用toString
        System.out.println(person);
    }
}

4.利用反射获取有参构造并创建对象_public

1.Class类中的方法:

getConstructor(Class<?>... parameterTypes)->获取指定的public的构造

parameterTypes:可变参数,可以传递0个或者多个参数

a.如果获取的是空参构造:参数不用写

b.如果获取的是有参构造:参数写参数类型的class对象

2.Constructor类中的方法:

T newInstance(Object...initargs) -> 创建对象

initargs:传递的是构造方法的实参

a.如果根据无参构造new对象,initargs不写了

b.如果根据有参构造new对象,initargs传递实参

java 复制代码
public class Demo06GetConstructor {
    public static void main(String[] args)throws Exception {
        //获取Class对象
        Class<Person> aClass = Person.class;

        Constructor<Person> constructor = aClass.getConstructor(String.class, Integer.class);
        System.out.println("constructor = " + constructor);

        //创建对象-> 好比是Person person = new Person("三上",26)
        Person person = constructor.newInstance("三上", 26);

        //好比是直接输出Person对象,直接调用toString
        System.out.println(person);
    }
}

5.利用反射获取私有构造(暴力反射)

  1. getDeclaredConstructors()获取所有构造方法,包括private

  2. getDeclaredConstructor(类<?>... parameterTypes) -> 获取指定构造,包括private

    parameterTypes:参数类型的class对象

  3. Constructor有一个父类叫做AccessibleObject ,里面有一个方法

    void setAccessible(boolean flag) -> 修改访问权限

    flag为true:解除私有权限

java 复制代码
public class Demo07GetConstructor {
    public static void main(String[] args) {
        Class<Person> aClass = Person.class;
        Constructor<?>[] dc = aClass.getDeclaredConstructors();
        for (Constructor<?> constructor : dc) {
            System.out.println(constructor);
        }
    }
}
java 复制代码
public class Demo08GetConstructor {
    public static void main(String[] args)throws Exception {
        Class<Person> aClass = Person.class;
        Constructor<Person> dc = aClass.getDeclaredConstructor(String.class);
        dc.setAccessible(true);//解除私有权限->暴力反射
        
        Person person = dc.newInstance("三上");
        System.out.println(person);

    }
}
相关推荐
wyiyiyi22 分钟前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
mit6.82437 分钟前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员42 分钟前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋1 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~1 小时前
《设计模式》装饰模式
java·设计模式
A尘埃2 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
鱼鱼说测试2 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
AntBlack2 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt