开发者社区> 林深> 正文

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

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




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java使用AES加解密
Java使用AES加解密 目录 1.1生成密钥 1.2密钥的存储 1.3获取存储的密钥 1.4加解密 1.5使用存储的密钥进行加解密示例   AES是一种对称的加密算法,可基于相同的密钥进行加密和解密。
1305 0
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(二)
14 0
使用Java程序通过http post访问Application server
使用Java程序通过http post访问Application server
19 0
Java 获取成员变量&构造函数
获取成员变量&构造函数 一、成员变量是java.lang.reflect.Field的对象 1、Field类封装了关于成员变量的操作 2、Field[] fs = c.getFields()方法获取所有public的成员变量Field[]信息 3、c.
723 0
【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
45 0
Java 获取类成员方法信息
一、基本的数据类型,void关键字等都存在类类型 Class c = 基类.class (int,String,double,void等) Class c1 = int.class; int的类类型 Class c2 = String.
736 0
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(一)
【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法(一)
19 0
java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html   java实现链栈的代码: package stackapplication; public class LinkStack { private...
1130 0
+关注
林深
非主流程序员,不爱加班爱专研。你说没有强者的心该如何成为强者呢?
26
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载