0
点赞
收藏
分享

微信扫一扫

Java反射机制

爱动漫建模 2022-02-14 阅读 82

 

 

package JavaReflcet;

import org.junit.Test;

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

/*

 */
public class ReflactionTest {

//    反射之前对于person类的操作
    @Test
    public void test1(){

//        创建person类的对象
        person p1 = new person("Tom",12);
//        调用其内部的属性和方法
        p1.setAge(10);
        System.out.println(p1);
        p1.show();
//        在person类的外部,无法使用person类对象调用person类中私有的结构。
    }

//    有了反射之后
    @Test
    public void test2() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
        Class clazz = person.class;
//        1.通过反射可以从创建person类的对象
        Constructor con = clazz.getConstructor(String.class, int.class);
        Object obj = con.newInstance("Tom",12);
        person p = (person) obj;
        System.out.println(p);
//        2.通过反射调用对象的属性。
        Field age = clazz.getDeclaredField("age");
        age.set(p,10);
        System.out.println(p);
//        调用方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);

//        3.通过反射调用私有结构。比如:私有构造器、属性、方法
//        调用了person类中的私有构造器  (String name)
        Constructor cons1 = clazz.getDeclaredConstructor(String.class);
        cons1.setAccessible(true);
        person p1 = (person) cons1.newInstance("jerry");
        System.out.println(p1);
//        调用私有属性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"hanmeimei");
        System.out.println(p1);
//        调用私有方法
        Method method = clazz.getDeclaredMethod("showNation", String.class);
        method.setAccessible(true);
        String nation = (String) method.invoke(p1,"中国");  //相当于 p1.showNation(”中国“)
        System.out.println(nation);

    }
}


 

举报

相关推荐

0 条评论