反射的应用、获取Class类实例

来源:互联网 发布:triz 矛盾矩阵 编辑:程序博客网 时间:2024/05/21 00:14

*准备工作:
包结构:*
这里写图片描述

=======================
Person.java代码:

package com.atguigu.java;public class Person {    String name;    private int age;    public Person() {        super();    }    public Person(String name, int age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public 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 "Person [name=" + name + ", age=" + age + "]";    }    public void show(){        System.out.println("我是一个show方法");    }}

=======================
反射的引用:

package com.atguigu.java;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;/* * 反射的应用 *  */public class ReflectionTest {    /*     * 在反射之前,如何实例化Person类,并调用其内部结构     */    @Test    public void test1(){        //1.创建Person类的对象        Person p1 = new Person();        System.out.println(p1);        //2.调用指定的属性        p1.name = "Tom";        //3.调用指定的方法        p1.setAge(12);        p1.show();        System.out.println(p1);    }    /*     * 反射的应用,完成与test1同样的操作     *      */    @Test    public void test2() throws Exception{        Class clazz = Person.class;// PrintStream ps = System.out;        //1.创建Person类的对象        Person p = (Person)clazz.newInstance();        System.out.println(p);        //2.调用指定的属性        //Field field1 = clazz.getField("name");会报错        Field field1 = clazz.getDeclaredField("name");        //设置指定的p对象的field1属性的值        //f.set(Object obj,Object fieldValue):将obj对象的f属性设置为fieldValue        field1.set(p, "Tom");        System.out.println(p);        //f.get(Object obj):获取指定的obj对象的f属性值        System.out.println(field1.get(p));        //3.调用指定的方法        Method m1 = clazz.getDeclaredMethod("setAge",int.class);        //m.invoke(Object obj,Object ... paramValues):调用obj对象指定的m方法,将参数值设置为Object ... paramValues        m1.invoke(p, 20);        System.out.println(p);    }}

===================================
获取Class类的实例的几种方式:

/*     * java.lang.Class类的理解     * 1.java反射机制的源头     * 2.java程序经过编译(javac.exe)以后,生成一个或多个字节码文件(.class)文件,接着通过     * java.exe命令将.class文件通过JVM的类的加载器加载到内存(缓存)中,一个字节码文件,就对应着一个     * 运行时类。     * 3.此时内存中的运行时类即为Class的一个实例。也就是说:一个Class实例就对应一个java运行时类     * 4.内存中的运行时类,是存放在内存的缓存区,当再次被调用时,不会重新加载。     *      * 如何获取java.lang.Class类的实例(掌握)     *      */    @Test    public void test1() throws ClassNotFoundException{        Person p = new Person();//1.将Person类加载到内存中 2.调用其空参的构造器        Person p1 = new Person();//不会重新加载Person类,因为其已经存在于内存中        //方式一:直接调用运行时类的.class属性获取        Class clazz1 = Person.class;        System.out.println(clazz1);        //方式二:调用Class类的静态方法:forName(String className)  --后续使用的较多        String className = "com.atguigu.java.Person";        Class clazz2 = Class.forName(className);        System.out.println(clazz2);        //方法三:调用运行时类对象的getClass()        Class clazz3 = p.getClass();        System.out.println(clazz3);        System.out.println(clazz1 == clazz2 && clazz1 == clazz3);//true        //方式四:使用类的加载器ClassLoader (了解)        Class clazz4 = this.getClass().getClassLoader().loadClass("com.atguigu.java.Person");        System.out.println(clazz4);        System.out.println(clazz4 == clazz1);    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 门锁住了没钥匙怎么办 车被别人锁住了怎么办 汽车轱辘被锁了怎么办 小车轮胎被锁了怎么办 国防光缆无明显标识被挖断怎么办 临工210挖掘机柴油进气怎么办 汽车抛光蜡干了怎么办 洗碗铁丝球吃了怎么办 牙套铁丝吃肚子怎么办 小铁丝吃到肚子怎么办 绿色抛光膏干了怎么办 不锈钢被盐酸弄黑了怎么办 不锈钢被草酸洗了怎么办 不锈钢洗菜盆被草酸腐蚀了怎么办 汽油发电机加了柴油怎么办 装载机发动机加入齿轮油怎么办 印尼的FromE错了怎么办 寄快递被弄坏了怎么办 福田口岸手表被扣怎么办? 网页显示与服务器连接失败怎么办 唯品会中发货无法清关怎么办 国际快递被海关扣了怎么办 我想开一家物流公司手续怎么办? 物流公司把我的货弄丢了怎么办 物流公司压司机工资怎么办 立元增压泵不出水怎么办 高浊度pac不沉怎么办 集水池中沉积大量污泥怎么办 电脑qq截图不好使怎么办 捡了个手机需要指纹怎么办 手机锁屏锁住了怎么办 三星屏锁忘记了怎么办 文字下面有蓝色直线怎么办 苹果x不能截屏了怎么办 u盘在电脑上打不开怎么办 电脑桌面上文档剪切了怎么办 苹果官网查不到保修日期怎么办 吃了发霉的花生怎么办 鸡吃大蒜多了怎么办 玖瑰花叶子黄怎么办 羊偷吃腥油和花生饼吃多了怎么办