java反射, 不看你可别后悔

开发中, 难免遇到些私有的属性和方法, 就好比下面的实体一样, 我们该怎么获得, 并玩弄于手掌呢?

我们先来个实体瞧瞧, 给你个对象你也new不了, hahaha… 单身wang

public class Student {
    private String name;
    private int age;
    private Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(){
        throw new IllegalAccessError("就不给你创建");
    }
    private String getName() {
        return name == null ? "" : name;
    }
    private void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在反射中如果是私有的, 不管是私有方法, 还是私有属性, 都必须在操作前设置setAccessible为false. 你要不设, 就等着GG呗!

反射步骤

1. 首先我们要找到要操作的对象

通过Class.forName(“…”), 找到你对象, 里面就写 包名+对象名, 后缀就算了, 谁不知道是个女的啊!

Class<?> clz = Class.forName("top.huiger.Student");

2. 找到对象在哪了, 但是我们还没找到创建的构造方法是不行的, 关于找哪个构造方法, 自己选择, 自己的对象自己找.

clz.getDeclaredConstructor(String.class, int.class);

3. 那我们来创建, 记得上面的找的构造方法是什么, 要匹配上才行.

Object student = constructor.newInstance("张三", 18); // 张三还是如花 看你爱好

4. 找到对象了, 我们来调用下, 但是公开的和私有的又有区别


  • 公开

clz.getMethod(“getAge”);
Method getAge = clz.getMethod("getAge");
System.out.println("--------------" + getAge.invoke(student));


  • 私有

clz.getDeclaredMethod(“getName”);, 上面说过, 私有的都要设置可修改的权限
Method getName = clz.getDeclaredMethod("getName");
getName.setAccessible(true);
String name = (String) getName.invoke(student);
System.out.println("--------------" + name);

5. 修改属性, 和调用方法类似

// 找到私有属性
Field age = clz.getDeclaredField("age");
age.setAccessible(true);
age.setInt(student, 20);   // 修改属性
System.out.println("--------------"+age.get(student));

全部演练代码都在这

Class<?> clz = Class.forName("top.huiger.Student");
// 找到带有这个参数的构造方法
Constructor constructor = clz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
// 初始化对象
Object student = constructor.newInstance("张三", 18);
System.out.println("--------------"+constructor.toString());

// 找到该私有方法
Method getName = clz.getDeclaredMethod("getName");
getName.setAccessible(true);
String name = (String) getName.invoke(student);
System.out.println("--------------"+name);

// 找到私有属性
Field age = clz.getDeclaredField("age");
age.setAccessible(true);
age.setInt(student, 20);   // 修改属性
System.out.println("--------------"+age.get(student));

最后输出

--------------private com.dong.wine.Student(java.lang.String,int)
--------------张三
--------------20
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhihui_520/article/details/80136598
个人分类: 开发经验 Java
想对作者说点什么? 我来说一句

plc安装必看

2014年05月21日 708B 下载

淘宝SEO秘密

2013年09月23日 1.66MB 下载

C#开发经验实例

2008年06月22日 1.63MB 下载

计算机网络

2008年02月24日 9MB 下载

最权威的程序员面试题

2012年10月24日 1.23MB 下载

超炫效果的jQuery相册插件

2009年08月08日 162KB 下载

ASP.NET常用三十三种代码

2008年12月31日 108KB 下载

MyEclipse中使用CVS

2013年04月15日 1.58MB 下载

学习资料电子本

2007年02月10日 532KB 下载

没有更多推荐了,返回首页

不良信息举报

java反射, 不看你可别后悔

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭