JAVA复习-反射之Class类

package com.atguigu.Reflection;

import com.atguigu.JavaImportant.Person;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**

  • @auther Elding_xrl
  • @create 2020-07-02-16:59
  • 关于java.lang.Class类的理解
  • 1、类加载的过程:
  • 程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)
  • 接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。
  • 此过程就称为类的加载。加载到内存中的类,我们称为运行时类,此运行时类,就作为Class的一个实例。
  • 2、换句话说,Class的实例就对应着 一个运行时类
  • 3、加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类

*/
public class JavaReflectiom {

@Test
public void test1 () throws Exception {
    //1、通过反射创建对象
    Class clazz = Person.class;
    //用反射的形式调用person的构造器方法
    Constructor con = clazz.getDeclaredConstructor(int.class,String.class);
    con.setAccessible(true);
    //得到了实例的对象后 给对象的属性赋值
    Person ton = (Person) con.newInstance(20,"Tom");
    //通过反射可以调用该类的私有方法。。。
    Field age = clazz.getDeclaredField("age");
    age.setAccessible(true);
    age.set(ton,50);
    System.out.println(ton.toString());

    Method show = clazz.getDeclaredMethod("show");
    show.setAccessible(true);
    show.invoke(ton);//相当于ton.show();

/* //反射若是不调用私有权限的方法,属性
Class clavv = Person.class;
Constructor tim = clavv.getConstructor(int.class,String.class);
Person tim1 = (Person) tim.newInstance(29, “tim”);

    Field age1 = clavv.getDeclaredField("age");
    age1.set(tim1,21);

    Method show1 = clavv.getDeclaredMethod("show");
    show1.invoke(tim1);*/

}


//获取Class的实例的方式
//clazz1 = clazz2 = clazz3
@Test
public void  test2(){
    //方式1:调用运行时类的属性.class
    Class clazz1 = Person.class;

    //方式2:通过运行时类的对象
    Person p = new Person();
    Class clazz2 = p.getClass();

    //方式3:调用class类的静态方法,forName();
    try {
        Class clazz3 = Class.forName("com.atguigu.JavaImportant.Person");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    //方式4:使用类的加载器:ClassLoader
    ClassLoader classLoader = JavaReflectiom.class.getClassLoader();
    try {
        Class clazz4 = (Class) classLoader.loadClass("com.atguigu.JavaImportant.Person");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

}

你可能感兴趣的:(java复习)