java反射, 不看你可别后悔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhihui_520/article/details/80136598

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

我们先来个实体瞧瞧, 给你个对象你也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
阅读更多
换一批

经典语录!不看你后悔!

09-28

1.青春是打开了就合不上的书,人生是踏上了就回不了头的路,爱情是扔出了就收不回的赌注。rn  2.每天把牢骚拿出来晒晒太阳,心情就不会缺钙。rn  3.要输就输给追求,要嫁就嫁给幸福。rn  4.相遇,心绪如白云飘飘;拥有,心花如雨露纷飞;错过,心灵如流沙肆虐。回首,幽情如蓝静夜清。rn  5.明明是傻,却说是逆向思维。rn  6.在人之上,要把人当人:在人之下 ,要把自己当人。rn  7.生活,就是生下来,活下去。rn  8.路是大地一道难愈的伤痕,因此人生每一步都是隐隐的痛。rn  9.若能一切随她去,便是世间自在人。rn  10.爱象圆周率,无限不循环。rn  11.网上岁月如飞刀,刀刀无情催人老。革命身体最重要,上网不要熬通宵。rn  12.漫漫人生路,一直在迷路。rn  13.有些故事的开始和结局造就注定了的,不管过程能用月光宝盒更改多少次。rn  14.青春,一旦典当,则永不能赎。rn  15.所谓的低调就是不露痕迹的高调。rn  16.别总埋怨老天对你不公,其实老天根本不知道你是谁。rn  17.别指望所有的人都能懂你,因为萝卜白菜,各有所爱。你做了萝卜,自然就做不成青菜。rn  18.美好的爱情,会教会我们如何看待一个不完美的人。rn  19.黑夜给了我黑色的鼠标,我却用它游戏到天明。rn  20.结婚三部曲:第一年,男的在说,女的在听;第二年,女的在说,男的在听;第三年,男女一起说,邻居在听。rn  21.要么忍,要么残忍。rn  22.不要为旧的悲伤,浪费新的眼泪。rn  23.最明目张胆的恭维,就是把“悍妇撒泼”说成是“贵妃醉酒”。rn  24.青春就是疯狂的奔跑,然后华丽地跌倒。rn  25.其实我们可以将所有的问题归结为两种:一种是没饭吃饿出来的;一种是吃饱了撑出来的。rn  26.念了十几年书,想起来还是幼儿园比较好混。rn  27.什么是幸福?幸福就是猫吃鱼,狗吃肉,奥特曼打小怪兽。rn  28.人生没有彩排,每天都是直播,不仅收视率低,而且工资不高。rn  29.夏天就是不好,穷的时候我连西北风都没有喝。rn  30.是金子总要发光的,但当满地都是金子的时候就不知道自己是哪颗了。rn  31.所谓浪漫就是帮老婆买白菜时顺手带回一朵玫瑰花!rn  32.金钱视我为粪土,我还视金钱为粪土呢!都是粪土谁怕谁啊!rn  33.幸福是个比较级,要有东西垫底才感觉的到。rn  34.成熟不是心变老,而是眼泪在眼里打转却保持微笑。rn  35.每个人出生的时候都是原创,悲哀的是,很多人渐渐都成了盗版!rn  36.理想很**,现实却很骨感。rn  37.男人:二十岁时是半成品;三十岁时是成品;四十岁时是精品;五十岁时是极品;六十岁时是样品;七十岁时纪念品。rn  38.灵感不是曹操,说来就来。rn  39.生命是充满遗憾的篇章,因为她没有机会让你修改病句。rn  40.世界上最远的距离不是树与树的距离,而是同根生长的树枝却无法在风中相依。rn  41.你又不是人民币,怎么能让人人喜欢你?rn  42.世界上每个人都是被上帝咬过一口的苹果…有的人缺陷比较大,那是因为上帝特别便爱她的芬芳。rn  43.如果必须失去,但愿是忧愁!如果必须遗忘,但愿是烦恼!rn  44.生活就象我的歌声,时而不靠谱,时而不着调。rn  45.我们无法浪费时间,我们浪费的只是我们自己。rn  46.发怒一分钟,不仅得不到任何快感,还失去了六十秒的幸福。rn  47.只要你脚还在地面上,就别把自己看的太轻;只要你还活在地球上,就别把自己看的太大。rn  48.每颗心都不是监狱,却都想关住悲伤,趁着我们还未老去,还是把它们都释放了吧。rn  49.对于一个父亲来说,向孩子表达爱意的最重要的方式莫过于爱他的妈妈。rn  50.没有准备请不要开始,没有能力请不要承诺。

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