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

来源:互联网 发布:pdf压缩软件 for mac 编辑:程序博客网 时间:2024/05/21 15:41

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

测试类

//OBClass.javapackage 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.javapackage 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等。




1 0
原创粉丝点击