【Java】java使用反射访问对象方法和成员变量

简介: 虽然java是一门静态语言,但是java的反射机制却给java提供了很强大的动态特性,其特点是能让java支持在运行时才能得知名称与内部结构的类,并能访问其所有的方法和成员变量,包括私有方法和私有成员变量。下面我写了一个比较简洁的测试代码,供参考和使用。 测试类 //OBClass.javapackage com.obo.javaassistdemo;public class

虽然java是一门静态语言,但是java的反射机制却给java提供了很强大的动态特性,其特点是能让java支持在运行时才能得知名称与内部结构的类,并能访问其所有的方法和成员变量,包括私有方法和私有成员变量。下面我写了一个比较简洁的测试代码,供参考和使用。

测试类

//OBClass.java
package com.obo.javaassistdemo;

public class OBClass {
    public int publicField= 999;
    private int privateField = 234;

    public static void main(String[] args) {
        System.out.println("hello world" + new OBClass().privateField);
        new OBClass().privateMethod();
    }

    public void publicMethod() {
        System.out.println("test public method");
    }

    public void publicMethodWithParam(String param) {
        System.out.println("test publicMethodWithParam's param is " + param);
    }

    private void privateMethod() {
        System.out.println("test private method");
    }

    public static void staticMethod() {
        System.out.println("test static method");
    }
}

利用反射来调用测试类的方法和成员变量。

//JavaAssistDemo.java
package com.obo.javaassistdemo;


import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javassist.CannotCompileException;
import javassist.NotFoundException;

/**
 * Created by obo on 16/2/5.
 */
public class JavaAssistDemo {
    public static void main(String []args) throws NotFoundException, CannotCompileException, IOException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        reflex();
    }

    //反射
    private static void reflex() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {
        //创建一个OBClass实例对象
        OBClass obClass = new OBClass();

        //获取OBClass的类对象
        Class myClass = OBClass.class;

        /// 无参数的public方法
        //反射回去OBClass中的方法名为publicMethod的方法
        Method publicMethod = myClass.getDeclaredMethod("publicMethod");
        //更改publicMethode方法的可访问属性为public
        //访问publicMethod方法
        publicMethod.invoke(obClass);

        /// 带参数的public方法
        //反射回去OBClass中的方法名为publicMethod的方法
        Method publicMethodWithParam = myClass.getDeclaredMethod("publicMethodWithParam",String.class);
        //更改publicMethode方法的可访问属性为public
        //访问publicMethod方法
        publicMethodWithParam.invoke(obClass,"hello");

        /// 无参数的private方法
        //反射回去OBClass中的方法名为publicMethod的方法
        Method privateMethod = myClass.getDeclaredMethod("privateMethod");
        //更改privateMethod方法的可访问属性为public,要想访问private方法必须要修改这一项
        privateMethod.setAccessible(true);
        //访问privateMethod方法
        privateMethod.invoke(obClass);

        /// 无参数的static方法
        //反射回去OBClass中的方法名为publicMethod的方法
        Method staticMethod = myClass.getDeclaredMethod("staticMethod");
        //访问static方法,静态方法的时候可以使用类对象作为参数
        staticMethod.invoke(myClass);

        /// 获取public 成员变量
        Field publicField = myClass.getDeclaredField("publicField");
        publicField.setAccessible(true);
        System.out.println("" + publicField.getInt(obClass));

        /// 获取private 成员变量
        Field privateField = myClass.getDeclaredField("privateField");
        privateField.setAccessible(true);
        System.out.println("" + privateField.getInt(obClass));

    }
}

上面分别提供了多种方法和成员变量的访问方式,可以组合起来进行使用。

有了java的反射机制,我们可以实现非常有意思也非常灵活的功能,比如说可以使用java类来创建数据库表的映射、也可以与javaassist的联合起来用于修改第三方api等。




目录
相关文章
|
7天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
33 11
|
3天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
6天前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
10天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
1天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
6 0
|
存储 SQL Java
Java反射读取注解信息
Java反射读取注解信息
62 0
|
JSON 安全 Java
|
4月前
|
安全 Java API
Java中的反射(通过反射获取类的结构、invoke方法、获取注解)
Java中的反射(通过反射获取类的结构、invoke方法、获取注解)
|
11月前
|
前端开发 Java 编译器
Java的第十六篇文章——枚举、反射和注解(后期再学一遍)
Java的第十六篇文章——枚举、反射和注解(后期再学一遍)
|
11月前
|
Java API 索引
Java基础知识复习02:从修饰符到反射注解(续Java基础01)
对应PDF已在资源内,自提 一、四种权限修饰符 一、四种权限修饰符
44 0