Java 反射 如何避免内部走构造函数

肆月之风 2015-07-09 12:31:24

public class People {
private String name = "1";

public People(String name){
this.name = "2";
}

public void setName(String name){
this.name = name;
}

public static voie main(String[] arg){
People people = new People("3");
people.setName("4");

//不管私有公有一律全强
Field field=object.getClass().getDeclaredField("name");
//参数值为true,禁用访问控制检查
field.setAccessible(true);
System.out.println(field.get(object));
}
}


程序输出 3, 后来发现反射每次都会走构造函数, 其实我想反射的结果是 4,如何做到??
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
scmod 2015-07-10
  • 打赏
  • 举报
回复
引用 3 楼 niqingyangniqingyang 的回复:
[quote=引用 2 楼 scmod 的回复:] 反射创建个实例还能不调用构造方法的??
所以我想问,怎么避免,我要反射的是其他人写的类[/quote] 这个不能避免啊...
引用 5 楼 Inhibitory 的回复:
[quote=引用 4 楼 niqingyangniqingyang 的回复:] [quote=引用 1 楼 Inhibitory 的回复:] 程序输出 3, 后来发现反射每次都会走构造函数, 其实我想反射的结果是 4,如何做到?? 确信你的程序能跑起来?voie 都编译不过,还有,People 里,“3” 根本没用,因为 public People(String name){ this.name = "2"; }
纯手工敲写,明眼人一看就知道是void,你有办法解决这个问题吗?[/quote] 你先写个能运行的程序看看,输出的就是 4:
import java.lang.reflect.*;

public class People {
    private String name = "1";

    public People(String name){
        this.name = "2";
    }

    public void setName(String name){
        this.name = name;
    }

    public static void main(String[] arg) throws Exception {
        People people = new People("3");
        people.setName("4");

        //不管私有公有一律全强
        Field field = people.getClass().getDeclaredField("name"); // 你用的是 object,不知道哪里来的,改成了 people
        //参数值为true,禁用访问控制检查
        field.setAccessible(true);
        System.out.println(field.get(people));
    }
}
[/quote] 这样不是就跟自己new个然后调用gettersetter一样么..... 除非没gettersetter方法...
Inhibitory 2015-07-10
  • 打赏
  • 举报
回复
引用 4 楼 niqingyangniqingyang 的回复:
[quote=引用 1 楼 Inhibitory 的回复:] 程序输出 3, 后来发现反射每次都会走构造函数, 其实我想反射的结果是 4,如何做到?? 确信你的程序能跑起来?voie 都编译不过,还有,People 里,“3” 根本没用,因为 public People(String name){ this.name = "2"; }
纯手工敲写,明眼人一看就知道是void,你有办法解决这个问题吗?[/quote] 你先写个能运行的程序看看,输出的就是 4:
import java.lang.reflect.*;

public class People {
    private String name = "1";

    public People(String name){
        this.name = "2";
    }

    public void setName(String name){
        this.name = name;
    }

    public static void main(String[] arg) throws Exception {
        People people = new People("3");
        people.setName("4");

        //不管私有公有一律全强
        Field field = people.getClass().getDeclaredField("name"); // 你用的是 object,不知道哪里来的,改成了 people
        //参数值为true,禁用访问控制检查
        field.setAccessible(true);
        System.out.println(field.get(people));
    }
}
肆月之风 2015-07-09
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
程序输出 3, 后来发现反射每次都会走构造函数, 其实我想反射的结果是 4,如何做到?? 确信你的程序能跑起来?voie 都编译不过,还有,People 里,“3” 根本没用,因为 public People(String name){ this.name = "2"; }
纯手工敲写,明眼人一看就知道是void,你有办法解决这个问题吗?
肆月之风 2015-07-09
  • 打赏
  • 举报
回复
引用 2 楼 scmod 的回复:
反射创建个实例还能不调用构造方法的??
所以我想问,怎么避免,我要反射的是其他人写的类
scmod 2015-07-09
  • 打赏
  • 举报
回复
反射创建个实例还能不调用构造方法的??
Inhibitory 2015-07-09
  • 打赏
  • 举报
回复
程序输出 3, 后来发现反射每次都会走构造函数, 其实我想反射的结果是 4,如何做到?? 确信你的程序能跑起来?voie 都编译不过,还有,People 里,“3” 根本没用,因为 public People(String name){ this.name = "2"; }

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧