zoukankan      html  css  js  c++  java
  • java反射系列一

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

    1.2 ●Java反射机制提供的功能
    ➢在运行时判断任意一 个对象所属的类
    ➢在运行时构造任意-个类的对象
    ➢在运行时判断任意一个类所具有的成员变量和方法
    ➢在运行时调用任意个对象的成员变量和方法
    ➢生成动态代理
     
    1.3  Java反射机制研究及应用
    ●反射相关的主要API:
    ➢java.lang.Class:代表一 个类
    ➢java.lang.reflect,Method:代表 类的方法
    ➢java.lang.reflect.Field:代表 类的成员变量
    ➢java.lang.reflect.Constructor:代表 类的构造方法

    二.代码示例
    package reflect;
    
    public class Person {
        public String name;
        private int age;
        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void show() {
            System.out.println("我是巫妖果子");
        }
        public void display(String nation) {
            System.out.println("我的国籍是: "+nation);
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        
    }
    package reflect;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class TestReflection {
        public static void main(String[] args) throws Exception {
            TestReflection t = new TestReflection();
            t.test2();
        }
         //反射思想.创建一个类的对象.并调用其中的结构
        public void test2() throws Exception {
            //此代码指向Person类,其所有属性.方法均暴露
            ①Class clazz = Person.class;
            
            /*
             * 1.创建clazz对应的运行时类Person类的对象
             * public T newInstance()
                  throws InstantiationException,
                         IllegalAccessException创建由此类对象表示的类的新实例。 
             */
            ②Person p = (Person)clazz.newInstance();
            System.out.println(p);
            /*
             * getField(String name) 
             * 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。 
             */
            ③Field f1 = clazz.getField("name");
            /*
             * set(Object obj, Object value) 
             * 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
             */
            ④f1.set(p, "巫妖果子");
            System.out.println(p);
            /*
             * 2.私有属性
             * getDeclaredField(String name) 返回一个 Field对象,
             * 它反映此表示的类或接口的指定已声明字段 类对象。
             */
            ⑤Field f2 = clazz.getDeclaredField("age");
            ⑥f2.setAccessible(true);
            f2.set(p, 20);
            System.out.println(p);
            
            /*
             * 3.通过反射调用运行时类的指定的方法
             *getMethods() 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,
             *包括那些由类或接口和那些从超类和超接口继承的声明
             */
            ⑦Method m1 = clazz.getMethod("display", String.class);
            /*
             * invoke(Object obj, Object... args) 
             * 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
             */
            ⑧m1.invoke(p, "中国");
            
            ⑨Method m2 = clazz.getMethod("show");
            m2.invoke(p);
        }
        
        //面向对象的思想.创建一个类的对象,并调用其中的方法.属性
        public void test1(){
            Person p = new Person();
            p.setAge(20);
            p.setName("巫妖果子");
            System.out.println(p);
            p.show();
            p.display("中国");
        }
    }

    程序分析:①②处相当于面向对象的

    Person p = new Person();
    这行代码,创建实例

    ③处是指定Person中的属性(公共权限)④处设置属性值⑤处由于age属性的权限是私有的,所以

    getDeclaredField("age")

    起声明作用⑥仅仅是这样还不足以设置私有属性,故有此行代码⑦处指定有参方法⑧处传参

    ⑨处是无参方法
     
  • 相关阅读:
    查看Android应用所需权限(uses-permission)
    Android Camera后台拍照
    傅里叶变换
    linux文件系统问题:wrong fs type, bad option, bad superblock
    H3 android 系统编译
    开源股票数据工具
    获取股票实时交易数据的方法
    获取历史和实时股票数据接口
    CRC在线计算工具
    硬盘自动挂载
  • 原文地址:https://www.cnblogs.com/zjm1999/p/10329864.html
Copyright © 2011-2022 走看看