黑马程序员技术交流社区

标题: 访问权限与反射。 [打印本页]

作者: 午夜b'Boy    时间: 2014-2-24 20:56
标题: 访问权限与反射。
publuc修饰可以直接反射获取,private修饰要暴力反射,那protected修饰及默认修饰需暴力吗?
作者: L_t    时间: 2014-2-26 09:17
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
* 反射获取构造方法并使用。
*
* 构造方法                Constructor
* 成员变量                Field
* 成员方法                Method
*
*
*/
public class ReflectDemo {
        public static void main(String[] args) throws ClassNotFoundException,
                        NoSuchMethodException, SecurityException, InstantiationException,
                        IllegalAccessException, IllegalArgumentException,
                        InvocationTargetException {
                // 获取字节码文件对象
                Class c = Class.forName("cn.itcast_01.Person");

                // 获取构造器对象
                // 所有公共构造方法
                // public Constructor<?>[] getConstructors()
                // Constructor[] cons = c.getConstructors();
                // 所有构造方法
                // public Constructor<?>[] getDeclaredConstructors()
                // Constructor[] cons = c.getDeclaredConstructors();
                // for (Constructor con : cons) {
                // System.out.println(con);
                // }

                // 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。
                // 我先以无参数构造方法举例
                // public Constructor<T> getConstructor(Class<?>... parameterTypes)
                Constructor con = c.getConstructor();// 表示我使用的是无参数构造方法

                // 通过构造器对象创建对象
                // public T newInstance(Object... initargs)
                Object obj = con.newInstance();
               
                System.out.println(obj);
        }
}


/*
* 获取私有成员变量并使用。
*/
public class ReflectDemo2 {
        public static void main(String[] args) throws Exception {
                // 获取字节码文件对象
                Class c = Class.forName("cn.itcast_01.Person");

                // 创建对象
                Constructor con = c.getConstructor();
                Object obj = con.newInstance();

                // 赋值前
                System.out.println(obj);

                // 获取年龄并赋值
                Field ageField = c.getField("age");
                ageField.set(obj, 26);

                // 获取姓名并赋值
                // NoSuchFieldException
                // Field nameField = c.getField("name");
                Field nameField = c.getDeclaredField("name");
                // IllegalAccessException
                //public void setAccessible(boolean flag)
                //暴力访问
                nameField.setAccessible(true);//你就不要限制我了。
                nameField.set(obj, "林青霞");

                // 赋值后
                System.out.println(obj);
        }
}

作者: qqwwdr    时间: 2014-2-26 09:43
查了下API;

public Field[] getDeclaredFields()
                          throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

public Field[] getFields()
                  throws SecurityException返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

可以确定,保护、默认(包)访问和私有字段 都需要暴力点,不要温柔,其实可以写一个测试程序测一下吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2