您的位置:首页 > 编程语言 > Java开发

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

2016-02-05 21:10 495 查看
虽然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等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息