A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 早知道 中级黑马   /  2013-9-22 10:37  /  1509 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 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);
复制代码
上面那样调用会报错。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 xscn 于 2013-9-22 10:49 编辑

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

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

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

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

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

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
楼主你这一行代码 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());
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
//反射私有方法public int  这里打错了,应该是普通方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马