Java学习路线-30: 反射与类操作

简介: Java学习路线-30: 反射与类操作

第23 章 : 反射与类操作

104 反射获取类结构信息

反射机制处理不仅仅只是一个实例化对象的处理,

更多情况下还有类的组成结构操作


任何一个类的组成结构:

父类、父接口、包、属性、方法(构造方法,普通方法)

// 获取包名 
public Package getPackage()
// 获取继承父类
public native Class<? super T> getSuperclass()
// 获取实现父接口
public Class<?>[] getInterfaces()
import java.util.Arrays;
abstract class AbstractHuman{
}
interface IConnectService{
    public boolean isConnect();
}
interface IChannelService{
    public void send();
}
class Person extends AbstractHuman implements IConnectService, IChannelService{
    @Override
    public boolean isConnect() {
        return true;
    }
    @Override
    public void send() {
        if(this.isConnect()){
            System.out.println("发送");
        }
    }
}
class Demo{
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        System.out.println(cls.getPackage());
        // null
        System.out.println(cls.getSuperclass());
        // class AbstractHuman
        System.out.println(Arrays.toString(cls.getInterfaces()));
        // [interface IConnectService, interface IChannelService]
    }
}

105 反射调用构造方法

实例化方法

// 获取指定构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
// 获取全部构造方法
public Constructor<?>[] getConstructors()
public Constructor<?>[] getDeclaredConstructors()
Class.getDeclaredConstructor().newInstance()
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Demo{
    public static void main(String[] args) throws Exception {
        Class<?> cls = Person.class;
        // 获取有参构造
        Constructor constructor = cls.getConstructor(String.class, int.class);
        Object obj = constructor.newInstance("小强", 23);
        System.out.println(obj);
        // Person{name='小强', age=23}
    }
}

使用反射的类最好提供无参构造方法,便于统一操作

继承关系

AccessibleObject(AnnotatedElement)
    -Executable
        -Constructor
        -Method
    -Field(Member)

106 反射调用普通方法

了解即可

// 获取指定方法
public Method getMethod(String name, Class<?>... parameterTypes)
// 获取全部方法
public Method[] getMethods()
// 获取本类方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
// 获取本类全部方法
public Method[] getDeclaredMethods()
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
class Person {
    public String geMessage(String message) {
        return message;
    }
}
class Demo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Person.class;
        Method method = cls.getMethod("geMessage", String.class);
        System.out.println(method);
        // public java.lang.String Person.geMessage(java.lang.String)
        System.out.println(Modifier.toString(method.getModifiers()));
        // public
        System.out.println(method.getReturnType().getName());
        // java.lang.String
        System.out.println(method.getName());
        // geMessage
        System.out.println(Arrays.toString(method.getParameterTypes()));
        // [class java.lang.String]
    }
}

Method类 重要方法 invoke

// 反射调用类中的方法
public Object invoke(Object obj, Object... args)

整个操作形式上没有任何明确的类对象产生,依靠反射操作,避免耦合问题

import java.lang.reflect.Method;
class Person {
    private String name;
    public Person() {
    }
    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
class Demo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("Person");
        String key = "name";
        String value = "Tom";
        // 获取指定方法
        Method setNameMethod = cls.getMethod("setName", String.class);
        Method getNameMethod = cls.getMethod("getName");
        // 调用无参构造方法实例化
        Object obj = cls.getDeclaredConstructor().newInstance();
        setNameMethod.invoke(obj, value); // 等价于 person.setName(value)
        System.out.println(getNameMethod.invoke(obj));
        // Tom
    }
}

107 反射调用成员

// 获取本类全部成员
public Field[] getDeclaredFields() 
// 获取本类指定成员
public Field getDeclaredField(String name)
// 获取父类全部成员
public Field[] getFields()
// 获取父类指定成员
public Field getField(String name)

Field 类

// 设置属性内容
public void set(Object obj, Object value)
// 获取属性内容
public Object get(Object obj)
// 解除封装
public void setAccessible(boolean flag)
import java.lang.reflect.Field;
class Person {
    private String name;
    public Person() {
    }
}
class Demo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("Person");
        Object obj = cls.getDeclaredConstructor().newInstance();
        Field nameField = cls.getDeclaredField("name");
        // 解除封装性,访问私有成员
        nameField.setAccessible(true);
        nameField.set(obj, "Tom");
        System.out.println(nameField.get(obj));
        // Tom
    }
}

不建议打破封装机制

Field类重要方法 getType

public Class<?> getType()
Class<?> cls = Class.forName("Person");
Field nameField = cls.getDeclaredField("name");
System.out.println(nameField.getType());
// class java.lang.String
System.out.println(nameField.getType().getName());
// 获取包.类 java.lang.String
System.out.println(nameField.getType().getSimpleName());
// 获取类名称 String

108 Unsafe工具类

通过反射获取对象,并且直接使用底层的C++代码

可以绕过JVM相关管理机制,就无法使用内存管理和垃圾回收


Unsafe 类

public final class Unsafe {
    private static final Unsafe theUnsafe;
    private Unsafe() {}
}

Unsafe绕过实例化对象的管理

import sun.misc.Unsafe;
import java.lang.reflect.Field;
// 将构造函数私有化
class Person{
    private Person(){};
    public void print(){
        System.out.println("hi");
    }
}
class Demo {
    public static void main(String[] args) throws Exception {
        Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafeField.setAccessible(true);
        Unsafe unsafeObject = (Unsafe) theUnsafeField.get(null);
        // 通过unsafe 实例化构造函数私有化的对象
        Person person = (Person) unsafeObject.allocateInstance(Person.class);
        person.print();
        // hi
    }
}

如果不是必须的情况下,不建议使用

Unsafe 类也是单例设计

相关文章
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
484 3
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
724 1
|
4月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
672 3
|
6月前
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
291 9
|
6月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
530 4
|
3月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
278 3
零基础到精通的史上最强 Java 学习路线图推荐
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
350 2
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
573 3
|
4月前
|
Java 数据库连接 微服务
零基础自学 Java 全栈必备最全学习路线及知识清单方向指引
本文为零基础学习者提供完整的Java全栈学习路线,涵盖Java基础、进阶、框架、项目实战及拓展方向,助你系统掌握全栈开发技能,快速成长为优秀Java工程师。
577 6
|
4月前
|
算法 Java 测试技术
适合新手小白的史上最强 Java 学习路线图从基础到进阶全程指南
本Java学习路线图涵盖从基础语法、面向对象、集合框架到进阶编程、JVM原理、Spring Boot框架,再到数据库操作与实战项目开发,内容系统全面,适合零基础新手入门与进阶提升,助力掌握Java全栈开发技能。
459 4