Java基础之—反射

一、反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(源自网络)。

二、反射的用法__调用构造方法

javaBean

package com.limingming.reflect;
public class University {
    int id;
    String name;
    public University(int id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("公共的构造方法");
    }
    protected University(int id) {
        this.id = id;
        System.out.println("受保护构造方法");
    }
    private University(String name) {
        this.name = name;
        System.out.println("私有的构造方法");
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   public void showMessage(String param){
        System.out.println("hahaha返给你一个妹子好不好。。。"+param);
    }
}

测试类

package com.limingming.reflect;
import java.lang.reflect.Constructor;

/*
 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
 *
 * 1.获取构造方法:
 *      1).批量的方法:
 *          public Constructor[] getConstructors():所有"公有的"构造方法
            public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

 *      2).获取单个的方法,并调用:
 *          public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 *          public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 *
 *          调用构造方法:
 *          Constructor-->newInstance(Object... initargs)
 */
public class ConstructorTest{
    public static void main(String[] args) throws Exception {
        Class cla=Class.forName("com.limingming.reflect.University");
        //获取所有public的构造方法
        Constructor[] constructors=cla.getConstructors();
        for (Constructor constructor:constructors){
            System.out.println(constructor);
        }
        //获取单个构造方法
        Constructor conPublic=cla.getConstructor(int.class,String.class);
        //调用公共的构造方法
        Object obj = conPublic.newInstance(1,"hahah");
        //获取私有的构造方法 并调用
        Constructor conPrivate = cla.getDeclaredConstructor(String.class);
        //暴力访问忽略访问权限
        conPrivate.setAccessible(true);
        Object obj1 = conPrivate.newInstance("hahha");
    }
}

getDeclaredConstructors() 方法 和 getDeclaredConstructor()方法的使用与上述相同不做概述

三、反射的用法__获取类属性并赋值

package com.limingming.reflect;
import java.lang.reflect.Field;
/*
 * 获取成员变量并调用:
 *
 * 1.批量的
 *      1).Field[] getFields():获取所有的"公有字段"
 *      2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
 * 2.获取单个的:
 *      1).public Field getField(String fieldName):获取某个"公有的"字段;
 *      2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
 *
 *   设置字段的值:
 *      Field --> public void set(Object obj,Object value):
 *                  参数说明:
 *                  1.obj:要设置的字段所在的对象;
 *                  2.value:要为字段设置的值;
 *
 */
public class FieldTest {
    public static void main(String[] args) throws Exception{
        Class cla=Class.forName("com.limingming.reflect.University");
        Field[] fields = cla.getFields();
        for (Field field:fields){
            System.out.println(field);
        }
        //为属性赋值
        Object obj=cla.newInstance();
        Field field = cla.getField("name");
        field.set(obj,"hahahha");
        //验证
        University university=(University)obj;
        System.out.println(university.name);
    }
}

四、反射的用法__调用类的方法

package com.limingming.reflect;

import java.lang.reflect.Method;

/*
 * 获取成员方法并调用:
 *
 * 1.批量的:
 *      public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
 *      public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
 * 2.获取单个的:
 *      public Method getMethod(String name,Class<?>... parameterTypes):
 *                  参数:
 *                      name : 方法名;
 *                      Class ... : 形参的Class类型对象
 *      public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 *
 *   调用方法:
 *      Method --> public Object invoke(Object obj,Object... args):
 *                  参数说明:
 *                  obj : 要调用方法的对象;
 *                  args:调用方式时所传递的实参;
 */
public class MethodTest {
    public static void main(String[] args) throws Exception {
        Class cla=Class.forName("com.limingming.reflect.University");
        //获取所有公有方法包括 继承过来的
        Method[] methods = cla.getMethods();
        for (Method method:methods){
            System.out.println(method);
        }
        //调用方法
        Object object = cla.newInstance();
        Method method = cla.getMethod("showMessage",String.class);
        method.invoke(object,"妹子来了");

    }
}

对于私有方法可使用setAccessible(true)方法暴力使用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 李笑来《写作课》第一课:写作的基础概念 一、写作的基础概念 1、为什么要学写作? 1)学会写作可以把同一份时间出售...
    飞舞随笔记阅读 518评论 0 1
  • 记不得,再记不得你的音容 风吹着我的脸,轻轻 我却觉得心万般得痛 泪花不在眼角绽放 只因我把它倒灌心中 外表看似坚...
    一夫爱青剑兮呜呼不孤阅读 146评论 2 8