天天看點

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;

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<Person> 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<Person> clazz4 = (Class<Person>) classLoader.loadClass("com.atguigu.JavaImportant.Person");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
           

}

繼續閱讀