反射的概述_反射应用实例

Reflection(反射)是被视为动态语言的关键,
反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
并能直接操作任意对象的内部属性及方法

package com.aff.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;

/*
      Reflection(反射)是被视为动态语言的关键,
      反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
      并能直接操作任意对象的内部属性及方法
      
Java反射机制提供的功能:
              ①在运行时判断任意一个对象所属的类
              ② 在运行时构造任意一个类的对象
              ③在运行时判断任意一个类所具有的成员变量和方法
              ④在运行时调用任意一个对象的成员变量和方法
              ⑤生成动态代理 
反射相关的主要API:
              ① java.lang.Class:代表一个类
              ②java.lang.reflect.Method:代表类的方法
              ③java.lang.reflect.Field:代表类的成员变量
              ④java.lang.reflect.Constructor:代表类的构造方法
                 。。。
 */
public class TestReflection {

    // 有了反射,可以通过反射创建一个类的对象,并调用其中的结构
    @Test
    public void test2() throws Exception {
        Class<Person> clazz = Person.class;
        // 1.创建clazz对应的运行时类的Person类的
        Person p = clazz.newInstance();
        System.out.println(p);// Person [name=null, age=0]

        // 2.通过反射调用运行时类的指定的属性
        // 2.1public 的属性
        Field f1 = clazz.getField("name");
        f1.set(p, "李白");
        System.out.println(p);// Person [name=李白, age=0]

        // 2.2private 的属性 使用getDeclaredField ,setAccessible(true)
        Field f2 = clazz.getDeclaredField("age");
        f2.setAccessible(true);
        f2.set(p, 33);
        System.out.println(p);// Person [name=李白, age=33]

        // 3.通过反射调用运行时类的指定的方法
        Method m1 = clazz.getMethod("show");
        m1.invoke(p);//后面可以跟参数,没有就去掉,  得即高歌失即休
        Method m2 = clazz.getMethod("display", String.class);//Class<?>... parameterTypes,  
//应写class类型的
m2.invoke(p, "罗隐");//多愁多恨亦悠悠 \n 罗隐 } // 在有反射机制以前,如何创建一个类的对象,并调用其中的方法,属性 @Test public void test1() { Person p = new Person(); p.setAge(35); p.setName("罗隐"); System.out.println(p); p.show(); p.display("晚唐"); } }

 

posted @ 2020-04-02 18:58  林淼零  阅读(357)  评论(0编辑  收藏  举报