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
  • 相关阅读:
    奥运圣火在家乡传递
    Please stop reinventing the wheel (请不要重复发明轮子)
    使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
    To invoke and to begin invoke, that is a question.
    XML和JSON(JavaScript Object Notation)
    Cloud Computing Is a Big Whiteboard
    TRIE Data Structure
    ASP.NET AJAX UpdatePanel 控件实现剖析
    分布式计算、网格计算和云计算
    系统架构设计师考试大纲(2009版)
  • 原文地址:https://www.cnblogs.com/afangfang/p/12622334.html
Copyright © 2011-2022 走看看