zoukankan      html  css  js  c++  java
  • 反射的概述_反射应用实例

    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, "罗隐");//多愁多恨亦悠悠 罗隐 } // 在有反射机制以前,如何创建一个类的对象,并调用其中的方法,属性 @Test public void test1() { Person p = new Person(); p.setAge(35); p.setName("罗隐"); System.out.println(p); p.show(); p.display("晚唐"); } }
    All that work will definitely pay off
  • 相关阅读:
    集合类型操作符
    ffmpeg 转换VC工具 V1.1.2 支持android.mk工程文件生成
    avplayer VS2008编译
    cocosBuiler使用简介&心得
    ffmpeg 转换VC工具 V1.1.2 支持android.mk工程文件生成
    ffmpeg优化
    avplayer VS2008编译
    VS2008+WDK 文件过滤驱动程序 开发环境配置
    cocosBuiler使用简介&心得
    ffmpeg优化
  • 原文地址:https://www.cnblogs.com/afangfang/p/12622334.html
Copyright © 2011-2022 走看看