黑马程序员技术交流社区

标题: 反射如何获取私有构造函数 [打印本页]

作者: 早知道    时间: 2013-9-22 10:37
标题: 反射如何获取私有构造函数
本帖最后由 杨增坤 于 2013-9-22 21:31 编辑

利用反射如何取得如下类的私有构造方法进行操作

  1. <P>public class Person {
  2. public String name;
  3. private int age;</P>
  4. <P> private Person(String name, int age) {
  5.   this.name = name;
  6.   this.age = age;
  7. }</P>
  8. <P> private Person(String name) {
  9.   this.name = name;</P>
  10. <P> }</P>
  11. <P> private Person() {</P>
  12. <P> }</P>
  13. <P>public int getAge{</P>
  14. <P>   return age;</P>
  15. <P>}
  16. }</P>
复制代码
如果
  1. Constructor con= Person.class.getConstructor(String.class);
复制代码
上面那样调用会报错。


作者: xscn    时间: 2013-9-22 10:47
本帖最后由 xscn 于 2013-9-22 10:49 编辑

暴力反射
调用Class类对象的getDeclaredConstructor,返回一个Constructor类对象,再调用他的setAccessible
单词字面意思也挺好理解,就是“得到所声明的构造方法”,然后”设置可以访问“ture


作者: 曾林魁    时间: 2013-9-22 11:50
你好,要想利用反射获取类的私有构造方法并操作它,你可以利用Class类的public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)方法,然后再调用Constructor类的setAccessible
方法,并向他传递一个值为true的参数,你就可以操作这个构造方法了;在反射中利用getDeclaredXxxx()方法可以获取被任何修饰符修饰过的成员;但是要想操作非公有成员时。需要调用该成员的setAccessible
方法并传入一个值为true的参数;这个过程也叫暴力反射;

发过来想一下,Java中的反射技术也彻底的破坏了封装;所有的类成员都能通过发射技术获得。。

希望以上的回答能帮到你!!

作者: yting_xmei1129    时间: 2013-9-22 15:01
楼主你这一行代码 public int getAge{ 怎么可以编译通过呢?少了括号啊!,应该是public int getAge(){ 这样吧!
下面饿已经为你把反射私有构造方法跟反射普通方法都写好了,楼主看下是否正确、、、


package com.yting.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Person {
        public String name;
        private int age;

        private Person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        private Person(String name) {
                this.name = name;
        }

        private Person() {
        }

        public int getAge() {
                return age;
        }

        public static void main(String[] args) throws Exception {
                Person p = new Person("zhangsan", 12);
                Method method_common = p.getClass().getMethod("getAge");   //反射私有方法public int getAge();
                System.out.println(method_common.invoke(p));   //输出结果
               
                //反射私有构造方法
                Constructor method_constructor = p.getClass().getDeclaredConstructor(String.class,int.class);
                method_constructor.setAccessible(true);
                Person p_test = (Person) method_constructor.newInstance("lisi",56);
                System.out.println("p_test --> age :" + p_test.getAge());
        }
}
作者: yting_xmei1129    时间: 2013-9-22 15:02
//反射私有方法public int  这里打错了,应该是普通方法




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