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

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

=======================
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);

    }
原文地址:https://www.cnblogs.com/lisingshen/p/7499735.html