zoukankan      html  css  js  c++  java
  • JAVA---反射

    当用到一个类对象的时候,JVM会把此类的Class字节码文件加载到内存中(只加载一次),JVM会此类的信息封装成对象。利用封装好的对象获取类的相关信息进行构造类或者调用方法等,叫做反射。

    反射的目的和作用就是为了开发者写出更通用的代码。

    • 把类名称,继承,实现封装成Class对象
    • 把类的构造方法封装成Constructor对象
    • 把类的成员属性封装成File对象
    • 把类的普通方法、返回值封装成Method对象

    举例

    package com.myjava.reflect;
    
    public class Person
    {
        private int _age;
        private String _name;
    
        public int get_age()
        {
            return _age;
        }
    
        public void say()
        {
            System.out.println(_name + "今年" + _age + "岁了");
        }
    
        public void set_age(int _age)
        {
            this._age = _age;
        }
    
        public Person(int _age, String _name)
        {
            super();
            this._age = _age;
            this._name = _name;
        }
    
        public String get_name()
        {
            return _name;
        }
    
        public void set_name(String _name)
        {
            this._name = _name;
        }
    }

    主程序

    package com.myjava.reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    /**
     * @ClassName: ReflectTest
     * @Description: TODO(这里用一句话描述这个类的作用)
     * @author 刘阳阳
     * @date 2016年10月5日 上午9:20:32
     *
     */
    
    public class ReflectTest
    {
    
        public static void main(String[] args)
                throws ClassNotFoundException, NoSuchMethodException,
                SecurityException, IllegalAccessException, IllegalArgumentException,
                InvocationTargetException, InstantiationException
    
        {
            // 根据类名进行加载,此加载不进行对象构造生成
            Class myClass = Class.forName("com.myjava.reflect.Person");
            // 这个需要导入对应的Person
            // Class myClass = Person.class;
            // 这个是进行实例化后获取对应的类信息
            // Class myClass = new Person(11, "honey").getClass();
            System.err.println(myClass.getName()); // 获取类名称
            Field[] Fields = myClass.getDeclaredFields();// 获取成员字段
            for (Field f : Fields)
            {
                System.err.println(f.getName());// 获取成员名称
                System.err.println(f.getModifiers());// 声明的权限 default private public
                                                     // protected
                System.err.println(f.getType());// 获取成员类型
    
            }
            Constructor[] constructors = myClass.getDeclaredConstructors();
            for (Constructor con : constructors)
            {
                System.err.println(con.getName());
                System.err.println(con.getModifiers());// 声明的权限 default private
                                                       // public protected
                System.err.println(con.getParameterCount());// 参数个数
                System.err.println(con.getParameters()); // 参数集合
    
            }
    
            // 调用此对象中的SAY方法,构造参数位_age=11,_name=honey
            myClass.getMethod("say")
                    .invoke(myClass.getConstructor(int.class, String.class)
                            .newInstance(11, "honey"), null);
        }
    
    }

    程序执行结果为

    com.myjava.reflect.Person
    _age
    2
    int
    _name
    2
    class java.lang.String
    com.myjava.reflect.Person
    1
    2
    [Ljava.lang.reflect.Parameter;@15db9742
    honey今年11岁了

  • 相关阅读:
    Android源码学习之如何使用eclipse+NDK
    Android NDK 工具链的使用方法(Standalone Toolchain)
    gcc和g++的区别
    OCP-1Z0-051-V9.02-42题
    OCP-1Z0-051-V9.02-41题
    OCP-1Z0-051-V9.02-40题
    OCP-1Z0-051-V9.02-39题
    windows下自动生成文件夹下所有JNI所需的.h头文件
    OCP-1Z0-051-V9.02-38题
    Oracle DB 视图
  • 原文地址:https://www.cnblogs.com/Coolkaka/p/5931772.html
Copyright © 2011-2022 走看看